{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Examples of plugins usage in folium"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.8.3+52.g2758dc7.dirty\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "\n",
    "import numpy as np\n",
    "\n",
    "import folium\n",
    "from folium import plugins\n",
    "\n",
    "print(folium.__version__)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In this notebook we show a few illustrations of folium's plugin extensions. These are available after importing `folium.plugins`."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## ScrollZoomToggler\n",
    "Adds a button to enable/disable zoom scrolling."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgCiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgTF9OT19UT1VDSCA9IGZhbHNlOwogICAgICAgICAgICBMX0RJU0FCTEVfM0QgPSBmYWxzZTsKICAgICAgICA8L3NjcmlwdD4KICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjEyLjQubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2Nzcy9ib290c3RyYXAubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9mb250LWF3ZXNvbWUvNC42LjMvY3NzL2ZvbnQtYXdlc29tZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC4yL2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9weXRob24tdmlzdWFsaXphdGlvbi9mb2xpdW0vbWFzdGVyL2ZvbGl1bS90ZW1wbGF0ZXMvbGVhZmxldC5hd2Vzb21lLnJvdGF0ZS5jc3MiLz4KICAgIDxzdHlsZT5odG1sLCBib2R5IHt3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7bWFyZ2luOiAwO3BhZGRpbmc6IDA7fTwvc3R5bGU+CiAgICA8c3R5bGU+I21hcCB7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7cmlnaHQ6MDtsZWZ0OjA7fTwvc3R5bGU+CiAgICAKICAgICAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwKICAgICAgICAgICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgICAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAgICAgI21hcF80NTA3OWQxN2FlNzM0ZjJhYWQzZjI1N2ZhZTkxZTUzZiB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgbGVmdDogMC4wJTsKICAgICAgICAgICAgICAgICAgICB0b3A6IDAuMCU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIDwvc3R5bGU+CiAgICAgICAgCiAgICAKICAgICAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAgICAgI3Njcm9sbF96b29tX3RvZ2dsZXJfY2U5NWYzNzIwMzRmNDM4Nzk2Y2Y5NzliNmI3NzBiNWEgewogICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOmFic29sdXRlOwogICAgICAgICAgICAgICAgICAgIHdpZHRoOjM1cHg7CiAgICAgICAgICAgICAgICAgICAgYm90dG9tOjEwcHg7CiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OjM1cHg7CiAgICAgICAgICAgICAgICAgICAgbGVmdDoxMHB4OwogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6I2ZmZjsKICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOmNlbnRlcjsKICAgICAgICAgICAgICAgICAgICBsaW5lLWhlaWdodDozNXB4OwogICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzQ1MDc5ZDE3YWU3MzRmMmFhZDNmMjU3ZmFlOTFlNTNmIiA+PC9kaXY+CiAgICAgICAgCiAgICAKICAgICAgICAgICAgPGltZyBpZD0ic2Nyb2xsX3pvb21fdG9nZ2xlcl9jZTk1ZjM3MjAzNGY0Mzg3OTZjZjk3OWI2Yjc3MGI1YSIKICAgICAgICAgICAgICAgICBhbHQ9InNjcm9sbCIKICAgICAgICAgICAgICAgICBzcmM9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2lvbmljb25zLzIuMC4xL3BuZy81MTIvYXJyb3ctbW92ZS5wbmciCiAgICAgICAgICAgICAgICAgc3R5bGU9InotaW5kZXg6IDk5OTk5OSIKICAgICAgICAgICAgICAgICBvbmNsaWNrPSJtYXBfNDUwNzlkMTdhZTczNGYyYWFkM2YyNTdmYWU5MWU1M2YudG9nZ2xlU2Nyb2xsKCkiPgogICAgICAgICAgICA8L2ltZz4KICAgICAgICAKPC9ib2R5Pgo8c2NyaXB0PiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFwXzQ1MDc5ZDE3YWU3MzRmMmFhZDNmMjU3ZmFlOTFlNTNmID0gTC5tYXAoCiAgICAgICAgICAgICAgICAibWFwXzQ1MDc5ZDE3YWU3MzRmMmFhZDNmMjU3ZmFlOTFlNTNmIiwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjZW50ZXI6IFs0NS4wLCAzLjBdLAogICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcsCiAgICAgICAgICAgICAgICAgICAgem9vbTogNCwKICAgICAgICAgICAgICAgICAgICB6b29tQ29udHJvbDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBwcmVmZXJDYW52YXM6IGZhbHNlLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwoKICAgICAgICAgICAgCgogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyXzE5OThkNDc2NWYwYzQzNGNiZmExZDVhMWFjYmZiYWRlID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAiaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmciLAogICAgICAgICAgICAgICAgeyJhdHRyaWJ1dGlvbiI6ICJEYXRhIGJ5IFx1MDAyNmNvcHk7IFx1MDAzY2EgaHJlZj1cImh0dHA6Ly9vcGVuc3RyZWV0bWFwLm9yZ1wiXHUwMDNlT3BlblN0cmVldE1hcFx1MDAzYy9hXHUwMDNlLCB1bmRlciBcdTAwM2NhIGhyZWY9XCJodHRwOi8vd3d3Lm9wZW5zdHJlZXRtYXAub3JnL2NvcHlyaWdodFwiXHUwMDNlT0RiTFx1MDAzYy9hXHUwMDNlLiIsICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwgIm1heE5hdGl2ZVpvb20iOiAxOCwgIm1heFpvb20iOiAxOCwgIm1pblpvb20iOiAwLCAibm9XcmFwIjogZmFsc2UsICJvcGFjaXR5IjogMSwgInN1YmRvbWFpbnMiOiAiYWJjIiwgInRtcyI6IGZhbHNlfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NTA3OWQxN2FlNzM0ZjJhYWQzZjI1N2ZhZTkxZTUzZik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgbWFwXzQ1MDc5ZDE3YWU3MzRmMmFhZDNmMjU3ZmFlOTFlNTNmLnNjcm9sbEVuYWJsZWQgPSB0cnVlOwoKICAgICAgICAgICAgbWFwXzQ1MDc5ZDE3YWU3MzRmMmFhZDNmMjU3ZmFlOTFlNTNmLnRvZ2dsZVNjcm9sbCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2Nyb2xsRW5hYmxlZCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsRW5hYmxlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsV2hlZWxab29tLmRpc2FibGUoKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxFbmFibGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFdoZWVsWm9vbS5lbmFibGUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgbWFwXzQ1MDc5ZDE3YWU3MzRmMmFhZDNmMjU3ZmFlOTFlNTNmLnRvZ2dsZVNjcm9sbCgpOwogICAgICAgIAo8L3NjcmlwdD4=\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
      ],
      "text/plain": [
       "<folium.folium.Map at 0x7f819c62e5f8>"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m = folium.Map([45, 3], zoom_start=4)\n",
    "\n",
    "plugins.ScrollZoomToggler().add_to(m)\n",
    "\n",
    "m.save(os.path.join('results', 'Plugins_0.html'))\n",
    "\n",
    "m"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## MarkerCluster"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Adds a MarkerCluster layer on the map."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgCiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgTF9OT19UT1VDSCA9IGZhbHNlOwogICAgICAgICAgICBMX0RJU0FCTEVfM0QgPSBmYWxzZTsKICAgICAgICA8L3NjcmlwdD4KICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjEyLjQubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2Nzcy9ib290c3RyYXAubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9mb250LWF3ZXNvbWUvNC42LjMvY3NzL2ZvbnQtYXdlc29tZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC4yL2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9weXRob24tdmlzdWFsaXphdGlvbi9mb2xpdW0vbWFzdGVyL2ZvbGl1bS90ZW1wbGF0ZXMvbGVhZmxldC5hd2Vzb21lLnJvdGF0ZS5jc3MiLz4KICAgIDxzdHlsZT5odG1sLCBib2R5IHt3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7bWFyZ2luOiAwO3BhZGRpbmc6IDA7fTwvc3R5bGU+CiAgICA8c3R5bGU+I21hcCB7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7cmlnaHQ6MDtsZWZ0OjA7fTwvc3R5bGU+CiAgICAKICAgICAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwKICAgICAgICAgICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgICAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAgICAgI21hcF9jOWM5NDIyNGQ3Nzk0ZjEyODFlYzU3MmJjOTg0NGRjMiB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgbGVmdDogMC4wJTsKICAgICAgICAgICAgICAgICAgICB0b3A6IDAuMCU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIDwvc3R5bGU+CiAgICAgICAgCiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvbGVhZmxldC5tYXJrZXJjbHVzdGVyLzEuMS4wL2xlYWZsZXQubWFya2VyY2x1c3Rlci5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2xlYWZsZXQubWFya2VyY2x1c3Rlci8xLjEuMC9NYXJrZXJDbHVzdGVyLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9sZWFmbGV0Lm1hcmtlcmNsdXN0ZXIvMS4xLjAvTWFya2VyQ2x1c3Rlci5EZWZhdWx0LmNzcyIvPgo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwX2M5Yzk0MjI0ZDc3OTRmMTI4MWVjNTcyYmM5ODQ0ZGMyIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcF9jOWM5NDIyNGQ3Nzk0ZjEyODFlYzU3MmJjOTg0NGRjMiA9IEwubWFwKAogICAgICAgICAgICAgICAgIm1hcF9jOWM5NDIyNGQ3Nzk0ZjEyODFlYzU3MmJjOTg0NGRjMiIsCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2VudGVyOiBbNDUuMCwgMy4wXSwKICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3LAogICAgICAgICAgICAgICAgICAgIHpvb206IDQsCiAgICAgICAgICAgICAgICAgICAgem9vbUNvbnRyb2w6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgcHJlZmVyQ2FudmFzOiBmYWxzZSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIAoKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl8wNjA0ZWMwZDkxMmI0M2Q0YTQ3MzQyY2FiNjJhMzExMSA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgImh0dHBzOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nIiwKICAgICAgICAgICAgICAgIHsiYXR0cmlidXRpb24iOiAiRGF0YSBieSBcdTAwMjZjb3B5OyBcdTAwM2NhIGhyZWY9XCJodHRwOi8vb3BlbnN0cmVldG1hcC5vcmdcIlx1MDAzZU9wZW5TdHJlZXRNYXBcdTAwM2MvYVx1MDAzZSwgdW5kZXIgXHUwMDNjYSBocmVmPVwiaHR0cDovL3d3dy5vcGVuc3RyZWV0bWFwLm9yZy9jb3B5cmlnaHRcIlx1MDAzZU9EYkxcdTAwM2MvYVx1MDAzZS4iLCAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsICJtYXhOYXRpdmVab29tIjogMTgsICJtYXhab29tIjogMTgsICJtaW5ab29tIjogMCwgIm5vV3JhcCI6IGZhbHNlLCAib3BhY2l0eSI6IDEsICJzdWJkb21haW5zIjogImFiYyIsICJ0bXMiOiBmYWxzZX0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzljOTQyMjRkNzc5NGYxMjgxZWM1NzJiYzk4NDRkYzIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSA9IEwubWFya2VyQ2x1c3Rlckdyb3VwKAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFwX2M5Yzk0MjI0ZDc3OTRmMTI4MWVjNTcyYmM5ODQ0ZGMyLmFkZExheWVyKG1hcmtlcl9jbHVzdGVyXzk2NDgwZmE1ZTJiYjRiNDk5Yzg0NzIyODNmYzMxOWE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzlkMmNjNGY4ODZhNzRlZjY4MTdlNDgxMzNjNDRkOTVlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzYuMDQ5NTc1MTU4MDk1MzIsIC04LjY0MDUxMzQzMzcwMTY2N10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzk2NDgwZmE1ZTJiYjRiNDk5Yzg0NzIyODNmYzMxOWE5KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF81ZDIyMGFkMDc4NTQ0MmVjOWNmYTQxOWViMmMyNTM1NyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfNjk4MTZmNjM5MTJjNGZiMDk2ODZiNGQwODJhY2I5ODkgPSAkKGA8ZGl2IGlkPSJodG1sXzY5ODE2ZjYzOTEyYzRmYjA5Njg2YjRkMDgyYWNiOTg5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4wPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzVkMjIwYWQwNzg1NDQyZWM5Y2ZhNDE5ZWIyYzI1MzU3LnNldENvbnRlbnQoaHRtbF82OTgxNmY2MzkxMmM0ZmIwOTY4NmI0ZDA4MmFjYjk4OSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl85ZDJjYzRmODg2YTc0ZWY2ODE3ZTQ4MTMzYzQ0ZDk1ZS5iaW5kUG9wdXAocG9wdXBfNWQyMjBhZDA3ODU0NDJlYzljZmE0MTllYjJjMjUzNTcpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzRiNGU0YzZmZjIyNDdhZmFjMjBiNTczMjgzYjdlNmQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszOC40NDc0NzQ2NjExNjQzNiwgMjcuMzI4MzQ2MTc3MjQzODQ0XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFya2VyX2NsdXN0ZXJfOTY0ODBmYTVlMmJiNGI0OTljODQ3MjI4M2ZjMzE5YTkpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzlmZDdmMTE2M2E0YzQ0MzJhMWE5NmY4NTRmMzFlN2JjID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF8wMGNiMjNkMGVhYWY0MmMyOGJkMTg5NzcxZjNiOTJlMiA9ICQoYDxkaXYgaWQ9Imh0bWxfMDBjYjIzZDBlYWFmNDJjMjhiZDE4OTc3MWYzYjkyZTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjE8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfOWZkN2YxMTYzYTRjNDQzMmExYTk2Zjg1NGYzMWU3YmMuc2V0Q29udGVudChodG1sXzAwY2IyM2QwZWFhZjQyYzI4YmQxODk3NzFmM2I5MmUyKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzc0YjRlNGM2ZmYyMjQ3YWZhYzIwYjU3MzI4M2I3ZTZkLmJpbmRQb3B1cChwb3B1cF85ZmQ3ZjExNjNhNGM0NDMyYTFhOTZmODU0ZjMxZTdiYykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9iMWIxYWY0N2ZjYWU0YWYyYWEwOTFlNTRkYzY0MmMzNyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1Ljg4MTE4NzcwMzU5NTU5LCAyNS45MzgyNzA3NTQ3OTEwOV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzk2NDgwZmE1ZTJiYjRiNDk5Yzg0NzIyODNmYzMxOWE5KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9hNTE3NTRiMTk1Zjg0N2MzYTNlNjc4NDQwMzY1NzcwZSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfMjNmNmUwOTk4ZjZlNGFiYTg2MmRlNGQyNGY1MzhlNDQgPSAkKGA8ZGl2IGlkPSJodG1sXzIzZjZlMDk5OGY2ZTRhYmE4NjJkZTRkMjRmNTM4ZTQ0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4yPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2E1MTc1NGIxOTVmODQ3YzNhM2U2Nzg0NDAzNjU3NzBlLnNldENvbnRlbnQoaHRtbF8yM2Y2ZTA5OThmNmU0YWJhODYyZGU0ZDI0ZjUzOGU0NCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9iMWIxYWY0N2ZjYWU0YWYyYWEwOTFlNTRkYzY0MmMzNy5iaW5kUG9wdXAocG9wdXBfYTUxNzU0YjE5NWY4NDdjM2EzZTY3ODQ0MDM2NTc3MGUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZDJmY2I2ZTI5ODA4NDhhZThiZGU0MjU5YTc1MjM3NjEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNi4yNzU0OTA2NzU3ODcwNTQsIDEzLjk5NzIyNjkyNjg1NjYyN10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzk2NDgwZmE1ZTJiYjRiNDk5Yzg0NzIyODNmYzMxOWE5KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8zOGNmZTQ1YmZhY2Q0NjhjOGVkODE2MDJmNDQ4MzE2ZiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfZmI3Nzc5Mjc4MzRiNGVkZjllZDRlNDY0OGY2NjRmODMgPSAkKGA8ZGl2IGlkPSJodG1sX2ZiNzc3OTI3ODM0YjRlZGY5ZWQ0ZTQ2NDhmNjY0ZjgzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4zPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzM4Y2ZlNDViZmFjZDQ2OGM4ZWQ4MTYwMmY0NDgzMTZmLnNldENvbnRlbnQoaHRtbF9mYjc3NzkyNzgzNGI0ZWRmOWVkNGU0NjQ4ZjY2NGY4Myk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9kMmZjYjZlMjk4MDg0OGFlOGJkZTQyNTlhNzUyMzc2MS5iaW5kUG9wdXAocG9wdXBfMzhjZmU0NWJmYWNkNDY4YzhlZDgxNjAyZjQ0ODMxNmYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNWQ1YjVmMTg0OWI5NDk4Y2FhOTMyMTVmMDVlMzg3NmMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45OTAyODA4MjkwOTU3LCAtMC43Njg5OTkyMjk4MDQzMDYyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFya2VyX2NsdXN0ZXJfOTY0ODBmYTVlMmJiNGI0OTljODQ3MjI4M2ZjMzE5YTkpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzUxNWMzM2VmZmM0NzRmYjVhNTQxOWRlMTRkOTEyN2E1ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF85NDQwZjk0MDNkNjQ0YzllOWQ3MGIyOWM3NzNlMDdiNiA9ICQoYDxkaXYgaWQ9Imh0bWxfOTQ0MGY5NDAzZDY0NGM5ZTlkNzBiMjljNzczZTA3YjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjQ8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNTE1YzMzZWZmYzQ3NGZiNWE1NDE5ZGUxNGQ5MTI3YTUuc2V0Q29udGVudChodG1sXzk0NDBmOTQwM2Q2NDRjOWU5ZDcwYjI5Yzc3M2UwN2I2KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzVkNWI1ZjE4NDliOTQ5OGNhYTkzMjE1ZjA1ZTM4NzZjLmJpbmRQb3B1cChwb3B1cF81MTVjMzNlZmZjNDc0ZmI1YTU0MTlkZTE0ZDkxMjdhNSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9lMDhhODllNmI5ZjM0MDI0YTI2ZmRkNDljY2I1NTNjMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1Ljg1NzY2MTM4MTMxNDcsIC00LjMwNDA4NjQxMTk5ODAxNF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzk2NDgwZmE1ZTJiYjRiNDk5Yzg0NzIyODNmYzMxOWE5KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8yNzdmNGJjM2RiODQ0YzJhYTAxZmM5ZTJhN2I1ODBmMyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfZDIzOTUxZjM5NTQ5NDFkNGExYmYxYmZjNWJlYjExZDEgPSAkKGA8ZGl2IGlkPSJodG1sX2QyMzk1MWYzOTU0OTQxZDRhMWJmMWJmYzViZWIxMWQxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij41PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzI3N2Y0YmMzZGI4NDRjMmFhMDFmYzllMmE3YjU4MGYzLnNldENvbnRlbnQoaHRtbF9kMjM5NTFmMzk1NDk0MWQ0YTFiZjFiZmM1YmViMTFkMSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9lMDhhODllNmI5ZjM0MDI0YTI2ZmRkNDljY2I1NTNjMS5iaW5kUG9wdXAocG9wdXBfMjc3ZjRiYzNkYjg0NGMyYWEwMWZjOWUyYTdiNTgwZjMpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZDE5OWIyMmMyYTQwNDE5Y2E3ZmIyODY4MTQyYmNmYjAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny43NTA5MTM0NDA3Nzk2NCwgMjYuODAwODEzMjI4ODkzMTgzXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFya2VyX2NsdXN0ZXJfOTY0ODBmYTVlMmJiNGI0OTljODQ3MjI4M2ZjMzE5YTkpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2UyY2NhYTRmMjA2MTQyMjg4OTQ5YjUyNmQ0YWVjYzA3ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9mOTVlMWU1Y2YyZWM0MjU3ODA4MTI1ZGE4MWY0MmNjYSA9ICQoYDxkaXYgaWQ9Imh0bWxfZjk1ZTFlNWNmMmVjNDI1NzgwODEyNWRhODFmNDJjY2EiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjY8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZTJjY2FhNGYyMDYxNDIyODg5NDliNTI2ZDRhZWNjMDcuc2V0Q29udGVudChodG1sX2Y5NWUxZTVjZjJlYzQyNTc4MDgxMjVkYTgxZjQyY2NhKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2QxOTliMjJjMmE0MDQxOWNhN2ZiMjg2ODE0MmJjZmIwLmJpbmRQb3B1cChwb3B1cF9lMmNjYWE0ZjIwNjE0MjI4ODk0OWI1MjZkNGFlY2MwNykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8wM2UxNmM3NjcwMTY0Nzg5OWEyZjY2ODViNzY0NTdmNCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzU2LjMwODI2MjMyOTY1MjAyNCwgMTEuODU4MzE4OTg1Mjc5MTYyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFya2VyX2NsdXN0ZXJfOTY0ODBmYTVlMmJiNGI0OTljODQ3MjI4M2ZjMzE5YTkpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzBhZTc5NjA2ZjQyMDRhOThhNTg2MDZmZmYwMTgxYWU5ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9mOGMxZmU0MGE4OGM0OGFmYmMwYzMyYWJjZWM3MDkxZCA9ICQoYDxkaXYgaWQ9Imh0bWxfZjhjMWZlNDBhODhjNDhhZmJjMGMzMmFiY2VjNzA5MWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjc8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMGFlNzk2MDZmNDIwNGE5OGE1ODYwNmZmZjAxODFhZTkuc2V0Q29udGVudChodG1sX2Y4YzFmZTQwYTg4YzQ4YWZiYzBjMzJhYmNlYzcwOTFkKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzAzZTE2Yzc2NzAxNjQ3ODk5YTJmNjY4NWI3NjQ1N2Y0LmJpbmRQb3B1cChwb3B1cF8wYWU3OTYwNmY0MjA0YTk4YTU4NjA2ZmZmMDE4MWFlOSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8xZDcwZDUxZDhhNmE0YTZhODBhMmQwOGY1MTAyMzMxYiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc2MzcxNTczNzU1NDYsIDEwLjYxOTkzMTA4MDc5NDY2OF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzk2NDgwZmE1ZTJiYjRiNDk5Yzg0NzIyODNmYzMxOWE5KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF83OTFkYzE0Mzk1ZGI0YmFiOTQ4NTYyNDgxM2U4Y2ZjYyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfYmI1NzFmODMwOWU4NGY5OWE4ZjgyMWI5OTYxYzMyYWQgPSAkKGA8ZGl2IGlkPSJodG1sX2JiNTcxZjgzMDllODRmOTlhOGY4MjFiOTk2MWMzMmFkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij44PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzc5MWRjMTQzOTVkYjRiYWI5NDg1NjI0ODEzZThjZmNjLnNldENvbnRlbnQoaHRtbF9iYjU3MWY4MzA5ZTg0Zjk5YThmODIxYjk5NjFjMzJhZCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8xZDcwZDUxZDhhNmE0YTZhODBhMmQwOGY1MTAyMzMxYi5iaW5kUG9wdXAocG9wdXBfNzkxZGMxNDM5NWRiNGJhYjk0ODU2MjQ4MTNlOGNmY2MpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMzA3Mjc3ZWNmNzRjNDNjZWFlYjEwMTg5ODRlN2VhZTEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1NC42ODUyNzE5NTM3MjI3MywgNC43Mjc0ODk3MjIwMjE1MDZdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZWE2ZjdlYzgzMjI3NDg1MmIwMWU4NjhiM2E1NzEzNzkgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzA4OWZmY2Y5OGNlNzQzMmJhNGIyYTgwNmE2ZWFmMjgzID0gJChgPGRpdiBpZD0iaHRtbF8wODlmZmNmOThjZTc0MzJiYTRiMmE4MDZhNmVhZjI4MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+OTwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9lYTZmN2VjODMyMjc0ODUyYjAxZTg2OGIzYTU3MTM3OS5zZXRDb250ZW50KGh0bWxfMDg5ZmZjZjk4Y2U3NDMyYmE0YjJhODA2YTZlYWYyODMpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMzA3Mjc3ZWNmNzRjNDNjZWFlYjEwMTg5ODRlN2VhZTEuYmluZFBvcHVwKHBvcHVwX2VhNmY3ZWM4MzIyNzQ4NTJiMDFlODY4YjNhNTcxMzc5KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2U0NmIxOTllOTU5ZjQ5Y2ZhODFhN2JjOTdiYjM5ZDA2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTQuNDU2OTUzMTM3NDA3NDUsIDUuNjc0NTk3MTIxNTQyMDc0NV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzk2NDgwZmE1ZTJiYjRiNDk5Yzg0NzIyODNmYzMxOWE5KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF80NmVhNTcxOGVmMzc0NmNiYmI2ZDUyZGI2MzkyOTdiZCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfMmE5NWI5MDkwZmY2NDk4OGJlNTJjYWE3MzAyNDY1ZmYgPSAkKGA8ZGl2IGlkPSJodG1sXzJhOTViOTA5MGZmNjQ5ODhiZTUyY2FhNzMwMjQ2NWZmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4xMDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF80NmVhNTcxOGVmMzc0NmNiYmI2ZDUyZGI2MzkyOTdiZC5zZXRDb250ZW50KGh0bWxfMmE5NWI5MDkwZmY2NDk4OGJlNTJjYWE3MzAyNDY1ZmYpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZTQ2YjE5OWU5NTlmNDljZmE4MWE3YmM5N2JiMzlkMDYuYmluZFBvcHVwKHBvcHVwXzQ2ZWE1NzE4ZWYzNzQ2Y2JiYjZkNTJkYjYzOTI5N2JkKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2Y4MGVhOGFjMzk5MTQ5Yzg5YjEyM2IzOTcyYjBmNThlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzkuNTQ2MTc2NzM2MjE3NSwgLTIuMzEyNzAyNDMwMzk0Nzk1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFya2VyX2NsdXN0ZXJfOTY0ODBmYTVlMmJiNGI0OTljODQ3MjI4M2ZjMzE5YTkpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2FhYmZmNDExYjNmNjQ4M2U4MWUwZjljYmRhZWY2NjNlID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF8zODkwZjk2NDYxMjg0YjhmYTI5MjYwNGQ1ZGY5ZDgzMSA9ICQoYDxkaXYgaWQ9Imh0bWxfMzg5MGY5NjQ2MTI4NGI4ZmEyOTI2MDRkNWRmOWQ4MzEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjExPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2FhYmZmNDExYjNmNjQ4M2U4MWUwZjljYmRhZWY2NjNlLnNldENvbnRlbnQoaHRtbF8zODkwZjk2NDYxMjg0YjhmYTI5MjYwNGQ1ZGY5ZDgzMSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9mODBlYThhYzM5OTE0OWM4OWIxMjNiMzk3MmIwZjU4ZS5iaW5kUG9wdXAocG9wdXBfYWFiZmY0MTFiM2Y2NDgzZTgxZTBmOWNiZGFlZjY2M2UpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDIyMjNlODQ0ZTExNGU2OWEwMWRjZTdiNmI2ZGNhOWYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS43NzE5NzYwODY1ODQ3MzYsIDguMTIxODc5NTY2ODMwNzVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfM2U0ZTg2NDk5YTIwNDE5ZGI0ZTM5OWUwNThkMGYwMzQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzA3MjJlOTQxNmM5ODQ2ODY5ZmVmZDAyNWJkYjQzMmJiID0gJChgPGRpdiBpZD0iaHRtbF8wNzIyZTk0MTZjOTg0Njg2OWZlZmQwMjViZGI0MzJiYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+MTI8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfM2U0ZTg2NDk5YTIwNDE5ZGI0ZTM5OWUwNThkMGYwMzQuc2V0Q29udGVudChodG1sXzA3MjJlOTQxNmM5ODQ2ODY5ZmVmZDAyNWJkYjQzMmJiKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzQyMjIzZTg0NGUxMTRlNjlhMDFkY2U3YjZiNmRjYTlmLmJpbmRQb3B1cChwb3B1cF8zZTRlODY0OTlhMjA0MTlkYjRlMzk5ZTA1OGQwZjAzNCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9mNzhlODc4Zjk4MDM0Zjk2YjhiMmY0OTRiMDg0NzA1MyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzU3LjU3OTc1ODI4NTc2MjcxNSwgNy41NTk3NjAxMDk0MTIzOTQ1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFya2VyX2NsdXN0ZXJfOTY0ODBmYTVlMmJiNGI0OTljODQ3MjI4M2ZjMzE5YTkpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzkxOTkzODM1NWQ4YTQ5ZTI5YzFmY2ZiOTk1MDVkZjMzID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF8xNTI2NDVhM2IwYTg0Yzc1OWZlYTBiYWI0M2M3OTE0ZCA9ICQoYDxkaXYgaWQ9Imh0bWxfMTUyNjQ1YTNiMGE4NGM3NTlmZWEwYmFiNDNjNzkxNGQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjEzPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzkxOTkzODM1NWQ4YTQ5ZTI5YzFmY2ZiOTk1MDVkZjMzLnNldENvbnRlbnQoaHRtbF8xNTI2NDVhM2IwYTg0Yzc1OWZlYTBiYWI0M2M3OTE0ZCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9mNzhlODc4Zjk4MDM0Zjk2YjhiMmY0OTRiMDg0NzA1My5iaW5kUG9wdXAocG9wdXBfOTE5OTM4MzU1ZDhhNDllMjljMWZjZmI5OTUwNWRmMzMpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYzg4MzJjNDdmZGVjNGVhOGE0ZjUwMmVjMTRkZDdkMGIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszOS4xODY0MjgyODEwNDgwMiwgMjEuMjE4NzYxMjgyNjY2MjddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfOTIwODgyMDRlMmRjNDEyZjg4Nzk2YWI2OTQ5ZWQ2OGUgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzY5NjQyZGFjZGM5YzQ2MTI4NjViMGUyNTlmYjE4Yjg1ID0gJChgPGRpdiBpZD0iaHRtbF82OTY0MmRhY2RjOWM0NjEyODY1YjBlMjU5ZmIxOGI4NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+MTQ8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfOTIwODgyMDRlMmRjNDEyZjg4Nzk2YWI2OTQ5ZWQ2OGUuc2V0Q29udGVudChodG1sXzY5NjQyZGFjZGM5YzQ2MTI4NjViMGUyNTlmYjE4Yjg1KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2M4ODMyYzQ3ZmRlYzRlYThhNGY1MDJlYzE0ZGQ3ZDBiLmJpbmRQb3B1cChwb3B1cF85MjA4ODIwNGUyZGM0MTJmODg3OTZhYjY5NDllZDY4ZSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9mMWYzZjExNGY1YTE0ODFhYmExMTFhNGU4ODFlZGRmZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ2LjA2NjExODY4NzA0MjUyNSwgMjguODcyNTE3OTgwOTI0OTldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYzJmZTRmNjYxNmZhNDk5Y2IzNDczNmIzNmY5YzA2NzggPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2NiMjI2ZGRiYzIwZTQyZmZhMzU3ZWMxMDJjNDVmOGQ0ID0gJChgPGRpdiBpZD0iaHRtbF9jYjIyNmRkYmMyMGU0MmZmYTM1N2VjMTAyYzQ1ZjhkNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+MTU8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYzJmZTRmNjYxNmZhNDk5Y2IzNDczNmIzNmY5YzA2Nzguc2V0Q29udGVudChodG1sX2NiMjI2ZGRiYzIwZTQyZmZhMzU3ZWMxMDJjNDVmOGQ0KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2YxZjNmMTE0ZjVhMTQ4MWFiYTExMWE0ZTg4MWVkZGZkLmJpbmRQb3B1cChwb3B1cF9jMmZlNGY2NjE2ZmE0OTljYjM0NzM2YjM2ZjljMDY3OCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9kZjQxMWNjMDMzNzE0MGU0OTkzZThiM2ZlOWNmYTVlOCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY4MDIwNDIzODM0MjAzLCAxNS40MTIwODQ4MzMxNTA4MTRdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfN2VhNTBjZmViZmRhNGI4YjgwN2I2MTcwZDMwY2QwMjcgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzE2ODgyNzU2NDI0NjQwMDFhNDU3NGZjZjYzODdhZmU0ID0gJChgPGRpdiBpZD0iaHRtbF8xNjg4Mjc1NjQyNDY0MDAxYTQ1NzRmY2Y2Mzg3YWZlNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+MTY8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfN2VhNTBjZmViZmRhNGI4YjgwN2I2MTcwZDMwY2QwMjcuc2V0Q29udGVudChodG1sXzE2ODgyNzU2NDI0NjQwMDFhNDU3NGZjZjYzODdhZmU0KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2RmNDExY2MwMzM3MTQwZTQ5OTNlOGIzZmU5Y2ZhNWU4LmJpbmRQb3B1cChwb3B1cF83ZWE1MGNmZWJmZGE0YjhiODA3YjYxNzBkMzBjZDAyNykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl81YTFiODMzZDU1OTA0ZDIyYThiYTE5MjQzZGM4Nzc4NSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ2Ljc0MDIzMzkzMzY1NDU0NCwgMjcuNDg0NTQ4NDUwNzk2NTUyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFya2VyX2NsdXN0ZXJfOTY0ODBmYTVlMmJiNGI0OTljODQ3MjI4M2ZjMzE5YTkpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2FkOGVjZjIwNTdhMzQ5Yzk4MjFlYTQ4MWE3MDUxOTQ5ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF83YjM0NTM2Y2Q3YjY0MTk1ODJkYmY0ZTRhNmQ1NzcyZSA9ICQoYDxkaXYgaWQ9Imh0bWxfN2IzNDUzNmNkN2I2NDE5NTgyZGJmNGU0YTZkNTc3MmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjE3PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2FkOGVjZjIwNTdhMzQ5Yzk4MjFlYTQ4MWE3MDUxOTQ5LnNldENvbnRlbnQoaHRtbF83YjM0NTM2Y2Q3YjY0MTk1ODJkYmY0ZTRhNmQ1NzcyZSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl81YTFiODMzZDU1OTA0ZDIyYThiYTE5MjQzZGM4Nzc4NS5iaW5kUG9wdXAocG9wdXBfYWQ4ZWNmMjA1N2EzNDljOTgyMWVhNDgxYTcwNTE5NDkpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTEzZWEyMWJiNzNjNGI1ZmEwNjQ0N2UxYTBkMTFmYTMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1Ny4yNzg0MDA3Mjc2OTQxNywgMTguOTIyNDExNzU3NjAyNF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzk2NDgwZmE1ZTJiYjRiNDk5Yzg0NzIyODNmYzMxOWE5KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF84MGQyNzFkMTg1ZGM0YThhYjBmMzM4NjZjOTk0OGQ5YiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfMzZlMzVkOTQ5OWQ0NDJkMmFhMjgxNmJkN2IyNTk4MzIgPSAkKGA8ZGl2IGlkPSJodG1sXzM2ZTM1ZDk0OTlkNDQyZDJhYTI4MTZiZDdiMjU5ODMyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4xODwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF84MGQyNzFkMTg1ZGM0YThhYjBmMzM4NjZjOTk0OGQ5Yi5zZXRDb250ZW50KGh0bWxfMzZlMzVkOTQ5OWQ0NDJkMmFhMjgxNmJkN2IyNTk4MzIpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNTEzZWEyMWJiNzNjNGI1ZmEwNjQ0N2UxYTBkMTFmYTMuYmluZFBvcHVwKHBvcHVwXzgwZDI3MWQxODVkYzRhOGFiMGYzMzg2NmM5OTQ4ZDliKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzc5NWNhNDQxZjU2ZDQ4N2Q5Yzg0ZmRhZWNiYjczMTY3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDIuNDc2NDgyNDgxMDEwMzcsIDI5LjEzOTMxMjI1NDM2MTM1N10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzk2NDgwZmE1ZTJiYjRiNDk5Yzg0NzIyODNmYzMxOWE5KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8xZTI1YTIxMGY5ZjU0MDcwYWRhODJjODk3ODI4YWFlNyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfMjY3MWY1NDlhZTVlNDkzYmE0ZTE4ZTdkYTI2NWM0ZTUgPSAkKGA8ZGl2IGlkPSJodG1sXzI2NzFmNTQ5YWU1ZTQ5M2JhNGUxOGU3ZGEyNjVjNGU1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4xOTwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8xZTI1YTIxMGY5ZjU0MDcwYWRhODJjODk3ODI4YWFlNy5zZXRDb250ZW50KGh0bWxfMjY3MWY1NDlhZTVlNDkzYmE0ZTE4ZTdkYTI2NWM0ZTUpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNzk1Y2E0NDFmNTZkNDg3ZDljODRmZGFlY2JiNzMxNjcuYmluZFBvcHVwKHBvcHVwXzFlMjVhMjEwZjlmNTQwNzBhZGE4MmM4OTc4MjhhYWU3KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2QzZTNjNGJkMDQ3MjRjYjA5NzE3M2MwMDA2ZGQ3NDdiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuMzczMTU1Mzc0Mjk5NTIsIDE3LjAzNDQ4MzkwMjQ4NjY0XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFya2VyX2NsdXN0ZXJfOTY0ODBmYTVlMmJiNGI0OTljODQ3MjI4M2ZjMzE5YTkpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzJlZjVkY2JmZmMwYjRlZThiNGQ2MjkwMWQ0ODg0Y2FjID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF8yOTgwMjIwOWRmN2I0Nzc4OGI3ZTUwZjg3Mzk4ZTU1NiA9ICQoYDxkaXYgaWQ9Imh0bWxfMjk4MDIyMDlkZjdiNDc3ODhiN2U1MGY4NzM5OGU1NTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjIwPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzJlZjVkY2JmZmMwYjRlZThiNGQ2MjkwMWQ0ODg0Y2FjLnNldENvbnRlbnQoaHRtbF8yOTgwMjIwOWRmN2I0Nzc4OGI3ZTUwZjg3Mzk4ZTU1Nik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9kM2UzYzRiZDA0NzI0Y2IwOTcxNzNjMDAwNmRkNzQ3Yi5iaW5kUG9wdXAocG9wdXBfMmVmNWRjYmZmYzBiNGVlOGI0ZDYyOTAxZDQ4ODRjYWMpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZDY2NmVkMTI4NDk3NGIxOTgwNTdhMWI2MmE1NWI3YzggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0My4xMjI2NzkzNDYyNzM5MDUsIDUuMjM3MDc4NDMwODQ2MjExXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFya2VyX2NsdXN0ZXJfOTY0ODBmYTVlMmJiNGI0OTljODQ3MjI4M2ZjMzE5YTkpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzBjZjQxMTVmNTE2ZDQzZGRiYzkxMmM3YjFhZWM5NzBkID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9kMzQwODM2M2U3NmQ0MTAyOTVmMmYwNWI2MjI3N2UyNSA9ICQoYDxkaXYgaWQ9Imh0bWxfZDM0MDgzNjNlNzZkNDEwMjk1ZjJmMDViNjIyNzdlMjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjIxPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzBjZjQxMTVmNTE2ZDQzZGRiYzkxMmM3YjFhZWM5NzBkLnNldENvbnRlbnQoaHRtbF9kMzQwODM2M2U3NmQ0MTAyOTVmMmYwNWI2MjI3N2UyNSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9kNjY2ZWQxMjg0OTc0YjE5ODA1N2ExYjYyYTU1YjdjOC5iaW5kUG9wdXAocG9wdXBfMGNmNDExNWY1MTZkNDNkZGJjOTEyYzdiMWFlYzk3MGQpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfOTQ0NWMwYzc4MDM3NGUxZWE1NjBmMTJmNDQ0YWY1MjcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0Mi42NTc2NDcwNDQ3NDY1NSwgMTYuMDg3MDkyOTIwNjM5NThdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZjYyYjZiZTkzZDRmNDA2YmIzMzFmNGMxMTk3MzA3ODAgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2NmMWQyZTdhNWFjYzRlMTA4Y2FlOTBjNzI2NTJmZmNmID0gJChgPGRpdiBpZD0iaHRtbF9jZjFkMmU3YTVhY2M0ZTEwOGNhZTkwYzcyNjUyZmZjZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+MjI8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZjYyYjZiZTkzZDRmNDA2YmIzMzFmNGMxMTk3MzA3ODAuc2V0Q29udGVudChodG1sX2NmMWQyZTdhNWFjYzRlMTA4Y2FlOTBjNzI2NTJmZmNmKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzk0NDVjMGM3ODAzNzRlMWVhNTYwZjEyZjQ0NGFmNTI3LmJpbmRQb3B1cChwb3B1cF9mNjJiNmJlOTNkNGY0MDZiYjMzMWY0YzExOTczMDc4MCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8wODhkYjNjNTZkZDE0YzNlYTVkMTdlNjIxY2MyY2Y5MSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM5LjEwOTM1NjY0NDg1MzA2NSwgLTYuMzIwMzY4ODI1OTk0OTI2XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFya2VyX2NsdXN0ZXJfOTY0ODBmYTVlMmJiNGI0OTljODQ3MjI4M2ZjMzE5YTkpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2Y3YWExZTU3ODVhMjQxOTc4ODExMmQ3ZWJhYzE1ODZiID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9hZmJkZWQwNWY0NDE0MWQ3YjkwMzc2MjdmNmMzYzhkYyA9ICQoYDxkaXYgaWQ9Imh0bWxfYWZiZGVkMDVmNDQxNDFkN2I5MDM3NjI3ZjZjM2M4ZGMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjIzPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2Y3YWExZTU3ODVhMjQxOTc4ODExMmQ3ZWJhYzE1ODZiLnNldENvbnRlbnQoaHRtbF9hZmJkZWQwNWY0NDE0MWQ3YjkwMzc2MjdmNmMzYzhkYyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8wODhkYjNjNTZkZDE0YzNlYTVkMTdlNjIxY2MyY2Y5MS5iaW5kUG9wdXAocG9wdXBfZjdhYTFlNTc4NWEyNDE5Nzg4MTEyZDdlYmFjMTU4NmIpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfOWJkM2UwM2FhYTQyNGI2YzljZWI3NWViY2I3M2UyODYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1OS40OTAyOTYxMTU2NTA2NDQsIC0xLjU3MDA5MjM1NzYzMTQ5ODVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfOGU0NTllZmExMjhhNDI2NjgxZDUwODBlZTY2MDA2YzkgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzE5ZmY1NGY5NDVjNTQ1ZTVhMDUwMTUyYWJkNzAxNTZkID0gJChgPGRpdiBpZD0iaHRtbF8xOWZmNTRmOTQ1YzU0NWU1YTA1MDE1MmFiZDcwMTU2ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+MjQ8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfOGU0NTllZmExMjhhNDI2NjgxZDUwODBlZTY2MDA2Yzkuc2V0Q29udGVudChodG1sXzE5ZmY1NGY5NDVjNTQ1ZTVhMDUwMTUyYWJkNzAxNTZkKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzliZDNlMDNhYWE0MjRiNmM5Y2ViNzVlYmNiNzNlMjg2LmJpbmRQb3B1cChwb3B1cF84ZTQ1OWVmYTEyOGE0MjY2ODFkNTA4MGVlNjYwMDZjOSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9iN2QyZDU5Zjk4ZWI0YmVlODY2YmU1YmI3MTc4NzU2NCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjU0MjE1NDkyMzkzNjY0LCAxMS42MzAzNDUyODk5NTAwODJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYzNhNjliYjQ1Njg5NGRiNDk3MjY2YzU1ZTZhYThkOGYgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2QyY2E5MWZiMTAyNDQ4Njg5ZjYzYTY5YzQ3ZGE1Nzk4ID0gJChgPGRpdiBpZD0iaHRtbF9kMmNhOTFmYjEwMjQ0ODY4OWY2M2E2OWM0N2RhNTc5OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+MjU8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYzNhNjliYjQ1Njg5NGRiNDk3MjY2YzU1ZTZhYThkOGYuc2V0Q29udGVudChodG1sX2QyY2E5MWZiMTAyNDQ4Njg5ZjYzYTY5YzQ3ZGE1Nzk4KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2I3ZDJkNTlmOThlYjRiZWU4NjZiZTViYjcxNzg3NTY0LmJpbmRQb3B1cChwb3B1cF9jM2E2OWJiNDU2ODk0ZGI0OTcyNjZjNTVlNmFhOGQ4ZikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl81MjcxYWQ3ZWU3MjQ0NjYyYTYwNzdiMjU4Njk3ZTdjZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjMxMzI0NDc2NDc0MzIsIDQuNTMxNjIxNTU1MzY5MzJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZTM3ZDg2YzFiYTBhNGI0NGJmNDk1ZDgwODg4MzI5ZTcgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2I2ZjA5MGY2YTViNTRhMmViMzQ1ZGQwZjA2Nzg1YWZkID0gJChgPGRpdiBpZD0iaHRtbF9iNmYwOTBmNmE1YjU0YTJlYjM0NWRkMGYwNjc4NWFmZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+MjY8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZTM3ZDg2YzFiYTBhNGI0NGJmNDk1ZDgwODg4MzI5ZTcuc2V0Q29udGVudChodG1sX2I2ZjA5MGY2YTViNTRhMmViMzQ1ZGQwZjA2Nzg1YWZkKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzUyNzFhZDdlZTcyNDQ2NjJhNjA3N2IyNTg2OTdlN2NlLmJpbmRQb3B1cChwb3B1cF9lMzdkODZjMWJhMGE0YjQ0YmY0OTVkODA4ODgzMjllNykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl85ZTdlMzc2MzY4MzA0ODY3Yjg4YTI3NDMwNTI2MDlkZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzU5LjIxMjIyODg1MTUxODE1NSwgOC43MTQzMDU2NTY4MTk3MzJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfOGUwNjZjNjZkMzU0NGYxZGEwZGRjMGQ2YTUxOGM2YjEgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzIxZTFjYjZmMDY0MDQ3Yjk4YTUzYjdkZTk2MzZmZDk0ID0gJChgPGRpdiBpZD0iaHRtbF8yMWUxY2I2ZjA2NDA0N2I5OGE1M2I3ZGU5NjM2ZmQ5NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Mjc8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfOGUwNjZjNjZkMzU0NGYxZGEwZGRjMGQ2YTUxOGM2YjEuc2V0Q29udGVudChodG1sXzIxZTFjYjZmMDY0MDQ3Yjk4YTUzYjdkZTk2MzZmZDk0KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzllN2UzNzYzNjgzMDQ4NjdiODhhMjc0MzA1MjYwOWRkLmJpbmRQb3B1cChwb3B1cF84ZTA2NmM2NmQzNTQ0ZjFkYTBkZGMwZDZhNTE4YzZiMSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl81MzU4OThlY2ZiYzE0ZDQ3YjcyY2U0MGE2Y2NiN2I0OSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzU3LjIzMDkzODU4MjUzNDQ4LCAtOS4zNzY4MzkyMTAzNTU1ODhdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMGNjY2Y0ODhlNzNiNDZmZjhiYTY4ZmU0MzEzZDc0N2UgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzg0ZTYzODVkNGI4YTRkYTQ4ZWFhYWZlMTU0OWFiNDRkID0gJChgPGRpdiBpZD0iaHRtbF84NGU2Mzg1ZDRiOGE0ZGE0OGVhYWFmZTE1NDlhYjQ0ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Mjg8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMGNjY2Y0ODhlNzNiNDZmZjhiYTY4ZmU0MzEzZDc0N2Uuc2V0Q29udGVudChodG1sXzg0ZTYzODVkNGI4YTRkYTQ4ZWFhYWZlMTU0OWFiNDRkKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzUzNTg5OGVjZmJjMTRkNDdiNzJjZTQwYTZjY2I3YjQ5LmJpbmRQb3B1cChwb3B1cF8wY2NjZjQ4OGU3M2I0NmZmOGJhNjhmZTQzMTNkNzQ3ZSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8xYzE5ODFkN2Y5Y2U0NjM1OTcxNGRjY2NlNTU4OTZmYiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQxLjU0Mzg4NTE3NTE2NDg3NCwgMTEuMjUwMjkwMzE0NjEyMTk0XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFya2VyX2NsdXN0ZXJfOTY0ODBmYTVlMmJiNGI0OTljODQ3MjI4M2ZjMzE5YTkpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzZiN2U3YTU4NTNlNTRlZmE5YjcyNTAxYzkyMjNkNjZiID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF83YTcwNGIxYWMzMTM0ZGFmOTlkNThmZmFhMzFhZjc1NyA9ICQoYDxkaXYgaWQ9Imh0bWxfN2E3MDRiMWFjMzEzNGRhZjk5ZDU4ZmZhYTMxYWY3NTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjI5PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzZiN2U3YTU4NTNlNTRlZmE5YjcyNTAxYzkyMjNkNjZiLnNldENvbnRlbnQoaHRtbF83YTcwNGIxYWMzMTM0ZGFmOTlkNThmZmFhMzFhZjc1Nyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8xYzE5ODFkN2Y5Y2U0NjM1OTcxNGRjY2NlNTU4OTZmYi5iaW5kUG9wdXAocG9wdXBfNmI3ZTdhNTg1M2U1NGVmYTliNzI1MDFjOTIyM2Q2NmIpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZDlkNjY1Y2JhMjllNDJhZDllYTQyOTZjZGE3Mzk2YmYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszOS41MDE1NTY2NjIwNTcxMiwgMTAuNjkwODcyNDEyMzAyMzhdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZGRiZTYwMWE3MTZhNDY5Mjg2MTRiMzNiODlkNWNkM2IgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzQxMjY5OTBkNTM3ZDQ0MGRiM2VhMDM4NmVhZmExZGRiID0gJChgPGRpdiBpZD0iaHRtbF80MTI2OTkwZDUzN2Q0NDBkYjNlYTAzODZlYWZhMWRkYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+MzA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZGRiZTYwMWE3MTZhNDY5Mjg2MTRiMzNiODlkNWNkM2Iuc2V0Q29udGVudChodG1sXzQxMjY5OTBkNTM3ZDQ0MGRiM2VhMDM4NmVhZmExZGRiKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2Q5ZDY2NWNiYTI5ZTQyYWQ5ZWE0Mjk2Y2RhNzM5NmJmLmJpbmRQb3B1cChwb3B1cF9kZGJlNjAxYTcxNmE0NjkyODYxNGIzM2I4OWQ1Y2QzYikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl83ZTg5NzZlN2RjNDg0MTEyYTcyNTlhZDZkZjAxOTg4NSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUzLjg5NDY3NTk3MTM0NDU1NCwgMjAuNTA0MzI1NTQ5MTA5MDQ4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFya2VyX2NsdXN0ZXJfOTY0ODBmYTVlMmJiNGI0OTljODQ3MjI4M2ZjMzE5YTkpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzU3ZTE2NzY5MjVlYTRkMTZhODVmNzkyMmIxNDNkZDlmID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9kZWJiY2E5MDRmZDE0ZjM2YmNmNjM4M2UyY2E1ZDg1NiA9ICQoYDxkaXYgaWQ9Imh0bWxfZGViYmNhOTA0ZmQxNGYzNmJjZjYzODNlMmNhNWQ4NTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjMxPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzU3ZTE2NzY5MjVlYTRkMTZhODVmNzkyMmIxNDNkZDlmLnNldENvbnRlbnQoaHRtbF9kZWJiY2E5MDRmZDE0ZjM2YmNmNjM4M2UyY2E1ZDg1Nik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl83ZTg5NzZlN2RjNDg0MTEyYTcyNTlhZDZkZjAxOTg4NS5iaW5kUG9wdXAocG9wdXBfNTdlMTY3NjkyNWVhNGQxNmE4NWY3OTIyYjE0M2RkOWYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjBjZGUyOGM4NzY0NGIyYjhmMGU1ZDBjYWUzOTcyMDUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNi4zNTQ4MDM1ODExMDA0NCwgLTguMDQwMDIxNjU4ODgyMTYyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFya2VyX2NsdXN0ZXJfOTY0ODBmYTVlMmJiNGI0OTljODQ3MjI4M2ZjMzE5YTkpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2U4NjE2YjdlZTk4NDQzMDNhODk1ZmUwYjRjMzMxYmUxID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9lNzdmMzYzMTI4ZTc0ZmJmYWRlMjcyODlkZWE3YTI3NSA9ICQoYDxkaXYgaWQ9Imh0bWxfZTc3ZjM2MzEyOGU3NGZiZmFkZTI3Mjg5ZGVhN2EyNzUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjMyPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2U4NjE2YjdlZTk4NDQzMDNhODk1ZmUwYjRjMzMxYmUxLnNldENvbnRlbnQoaHRtbF9lNzdmMzYzMTI4ZTc0ZmJmYWRlMjcyODlkZWE3YTI3NSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl82MGNkZTI4Yzg3NjQ0YjJiOGYwZTVkMGNhZTM5NzIwNS5iaW5kUG9wdXAocG9wdXBfZTg2MTZiN2VlOTg0NDMwM2E4OTVmZTBiNGMzMzFiZTEpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMDAyYmNlZGY3YWU4NDI4Yjk0MWE5MTZjMjAyM2NkNTMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS43NTkwMTYzMTAwNjgxOSwgLTQuMjQxNjQwNTU2MDYzNTIzNV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzk2NDgwZmE1ZTJiYjRiNDk5Yzg0NzIyODNmYzMxOWE5KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9jMDFhMWNlM2NiMDc0MTNhYjRkMzhkNDMzNzJkYzgwMyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfNWFhOTdiNjNiNTJiNDM1NGE1ZTg2ZmMwNDQ5NmI4ZmYgPSAkKGA8ZGl2IGlkPSJodG1sXzVhYTk3YjYzYjUyYjQzNTRhNWU4NmZjMDQ0OTZiOGZmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4zMzwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9jMDFhMWNlM2NiMDc0MTNhYjRkMzhkNDMzNzJkYzgwMy5zZXRDb250ZW50KGh0bWxfNWFhOTdiNjNiNTJiNDM1NGE1ZTg2ZmMwNDQ5NmI4ZmYpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMDAyYmNlZGY3YWU4NDI4Yjk0MWE5MTZjMjAyM2NkNTMuYmluZFBvcHVwKHBvcHVwX2MwMWExY2UzY2IwNzQxM2FiNGQzOGQ0MzM3MmRjODAzKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzc2ZDE4ZTkyNGNkMzQyODY5NTc1MjljZjE4YTVhMzIxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzguODY4NzU0NDc5Nzc1MjYsIC0xMS42OTY3NjgwNDc1MDk5NTRdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNjk4OTNmMzIwMDk3NDQwYmIxMDkwNDI4ODU0Y2JiNTcgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2M5ZTg3NTY2NDg3ZjQ0MzliZmQ2OTk4Mzc3MGI4M2M5ID0gJChgPGRpdiBpZD0iaHRtbF9jOWU4NzU2NjQ4N2Y0NDM5YmZkNjk5ODM3NzBiODNjOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+MzQ8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNjk4OTNmMzIwMDk3NDQwYmIxMDkwNDI4ODU0Y2JiNTcuc2V0Q29udGVudChodG1sX2M5ZTg3NTY2NDg3ZjQ0MzliZmQ2OTk4Mzc3MGI4M2M5KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzc2ZDE4ZTkyNGNkMzQyODY5NTc1MjljZjE4YTVhMzIxLmJpbmRQb3B1cChwb3B1cF82OTg5M2YzMjAwOTc0NDBiYjEwOTA0Mjg4NTRjYmI1NykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl84ZDQzOWQwYzU4NjE0ZDQ3OWY5M2E3NDQ3N2FhZWUwZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljg5Mjc2NDQ5MjM2ODI4LCAyNS4yMzkzMDQ0OTI1MTEwOTZdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZDViNzZhMGFkMzdlNGZjMzlmZmZmNWRjMWRkZjJhMTcgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzc0ZGIxNjkyM2NmYjQzZWQ4YzYzOGRlNWY0NjVkNjJhID0gJChgPGRpdiBpZD0iaHRtbF83NGRiMTY5MjNjZmI0M2VkOGM2MzhkZTVmNDY1ZDYyYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+MzU8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZDViNzZhMGFkMzdlNGZjMzlmZmZmNWRjMWRkZjJhMTcuc2V0Q29udGVudChodG1sXzc0ZGIxNjkyM2NmYjQzZWQ4YzYzOGRlNWY0NjVkNjJhKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzhkNDM5ZDBjNTg2MTRkNDc5ZjkzYTc0NDc3YWFlZTBkLmJpbmRQb3B1cChwb3B1cF9kNWI3NmEwYWQzN2U0ZmMzOWZmZmY1ZGMxZGRmMmExNykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl80YmM2Zjc4ZTFiNGU0ODk3YWQ3YzVjNmIwYWYyOTE5ZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjM3ODc3ODEyNTk5NjMzLCAxNC43OTc4NjYzMjk4NzU4NDFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZTQ2YzJmMGY3YjkzNDhkMDkyMTcyODlmYjI1OThjMmQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2FlMzBhZDRkYTQ4OTRhNTNiNjFlMTk1NWY0ZTc2MzE0ID0gJChgPGRpdiBpZD0iaHRtbF9hZTMwYWQ0ZGE0ODk0YTUzYjYxZTE5NTVmNGU3NjMxNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+MzY8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZTQ2YzJmMGY3YjkzNDhkMDkyMTcyODlmYjI1OThjMmQuc2V0Q29udGVudChodG1sX2FlMzBhZDRkYTQ4OTRhNTNiNjFlMTk1NWY0ZTc2MzE0KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzRiYzZmNzhlMWI0ZTQ4OTdhZDdjNWM2YjBhZjI5MTlkLmJpbmRQb3B1cChwb3B1cF9lNDZjMmYwZjdiOTM0OGQwOTIxNzI4OWZiMjU5OGMyZCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl81MmY3MjRkYTNhYmM0MzE1OGMzNDcxNGE0ODA3ZTM1MCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUzLjc1NTE4MDI2NTQ5MTc2LCAtNy45MTMxMTAyODQ4OTg3NTFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYjAyNWExY2EwMGQ5NDAzZGI4YmUyOGEwZTgwNjliYTcgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzU5OWIyNTQzYmQyMjRhYTFiZDAyYzEzZmVjMjRmZDc0ID0gJChgPGRpdiBpZD0iaHRtbF81OTliMjU0M2JkMjI0YWExYmQwMmMxM2ZlYzI0ZmQ3NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Mzc8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYjAyNWExY2EwMGQ5NDAzZGI4YmUyOGEwZTgwNjliYTcuc2V0Q29udGVudChodG1sXzU5OWIyNTQzYmQyMjRhYTFiZDAyYzEzZmVjMjRmZDc0KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzUyZjcyNGRhM2FiYzQzMTU4YzM0NzE0YTQ4MDdlMzUwLmJpbmRQb3B1cChwb3B1cF9iMDI1YTFjYTAwZDk0MDNkYjhiZTI4YTBlODA2OWJhNykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8wOTVlNTg3MWNkODU0NDQzYjg2NzdiNThjZjIxNTkyNyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ2LjU4NTkzNTE2MDYzOTUzNiwgMjYuNTA5MTkzMjI1NjI3MDg3XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFya2VyX2NsdXN0ZXJfOTY0ODBmYTVlMmJiNGI0OTljODQ3MjI4M2ZjMzE5YTkpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzExNWMzZGYwZDA2MTQ0ODVhMDA1ZWEwOGQ4OWZjYjhkID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF83M2QxZGJiY2Q3N2Q0YjM3YTFhYzE3MjRmNmQ4YzQ3OSA9ICQoYDxkaXYgaWQ9Imh0bWxfNzNkMWRiYmNkNzdkNGIzN2ExYWMxNzI0ZjZkOGM0NzkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjM4PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzExNWMzZGYwZDA2MTQ0ODVhMDA1ZWEwOGQ4OWZjYjhkLnNldENvbnRlbnQoaHRtbF83M2QxZGJiY2Q3N2Q0YjM3YTFhYzE3MjRmNmQ4YzQ3OSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8wOTVlNTg3MWNkODU0NDQzYjg2NzdiNThjZjIxNTkyNy5iaW5kUG9wdXAocG9wdXBfMTE1YzNkZjBkMDYxNDQ4NWEwMDVlYTA4ZDg5ZmNiOGQpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMDQ1ZDcwNzUyZTkxNGFjYThiZWNkOWU3MDYxMTM2ZmIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1OC41OTk4MTg1NjEwNjg4MSwgMTcuNDAyNjI4MTYyNjM2NjJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZGZiZGRlNTIxM2FmNDk3N2FhZDczZTBkMzJhMGRmZGUgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2QxYjczN2ZiMGM1NzQ5ZGU5ZWNjMTNjOTA5ZDVmMzU5ID0gJChgPGRpdiBpZD0iaHRtbF9kMWI3MzdmYjBjNTc0OWRlOWVjYzEzYzkwOWQ1ZjM1OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Mzk8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZGZiZGRlNTIxM2FmNDk3N2FhZDczZTBkMzJhMGRmZGUuc2V0Q29udGVudChodG1sX2QxYjczN2ZiMGM1NzQ5ZGU5ZWNjMTNjOTA5ZDVmMzU5KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzA0NWQ3MDc1MmU5MTRhY2E4YmVjZDllNzA2MTEzNmZiLmJpbmRQb3B1cChwb3B1cF9kZmJkZGU1MjEzYWY0OTc3YWFkNzNlMGQzMmEwZGZkZSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9kNzVjMGNiZTA3Y2I0NWZmODYzZDRiMDE4MTdiMTA1YyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzU3LjY4NDU2OTgwMzUxNDEyLCAtNS44MTAzNDQ0NjIzNjg4OTA1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFya2VyX2NsdXN0ZXJfOTY0ODBmYTVlMmJiNGI0OTljODQ3MjI4M2ZjMzE5YTkpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzJmNWQwMDhmMzhlNzRmNzZhNWFjNTc5YTFmYzZhNDI5ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF80Y2ExOWY4MTkwY2Q0YTUxYjAwODEwYmUzZjI1OGNhNSA9ICQoYDxkaXYgaWQ9Imh0bWxfNGNhMTlmODE5MGNkNGE1MWIwMDgxMGJlM2YyNThjYTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjQwPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzJmNWQwMDhmMzhlNzRmNzZhNWFjNTc5YTFmYzZhNDI5LnNldENvbnRlbnQoaHRtbF80Y2ExOWY4MTkwY2Q0YTUxYjAwODEwYmUzZjI1OGNhNSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9kNzVjMGNiZTA3Y2I0NWZmODYzZDRiMDE4MTdiMTA1Yy5iaW5kUG9wdXAocG9wdXBfMmY1ZDAwOGYzOGU3NGY3NmE1YWM1NzlhMWZjNmE0MjkpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDJmMjA3NTc0MTdiNDFkM2E0M2NhNmEyZWFjZjE1MTEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS4wNjIxNTAwNzA1MjU3MywgMTYuNTA0ODY1ODc3MTQ0ODFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfOTA2Yzg3MmE5NDBhNGNkYmIyNmM3YmFkZGQyMmNkNjEgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzU4MjcwYTg2YWRkNjRlMjViYWE0NGJmYzNmNGJhYmEzID0gJChgPGRpdiBpZD0iaHRtbF81ODI3MGE4NmFkZDY0ZTI1YmFhNDRiZmMzZjRiYWJhMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+NDE8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfOTA2Yzg3MmE5NDBhNGNkYmIyNmM3YmFkZGQyMmNkNjEuc2V0Q29udGVudChodG1sXzU4MjcwYTg2YWRkNjRlMjViYWE0NGJmYzNmNGJhYmEzKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzQyZjIwNzU3NDE3YjQxZDNhNDNjYTZhMmVhY2YxNTExLmJpbmRQb3B1cChwb3B1cF85MDZjODcyYTk0MGE0Y2RiYjI2YzdiYWRkZDIyY2Q2MSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl84MzY5NTEwYWQzZGI0NmQzOTc4ZTVlMDkyZWE0YWQ1NiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQyLjY1OTI1OTc2NzQyODgxLCAyNi44MTg3NTg5ODQ1NjkxOF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzk2NDgwZmE1ZTJiYjRiNDk5Yzg0NzIyODNmYzMxOWE5KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8xNzg0ODVhMGZkNWY0NTFkOGY1Y2ZiZmM0MzBmM2Y3NSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfNDEzZTU2NjE0MWM4NDczYjg5NzI5MmIwMTllZjcyM2MgPSAkKGA8ZGl2IGlkPSJodG1sXzQxM2U1NjYxNDFjODQ3M2I4OTcyOTJiMDE5ZWY3MjNjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij40MjwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8xNzg0ODVhMGZkNWY0NTFkOGY1Y2ZiZmM0MzBmM2Y3NS5zZXRDb250ZW50KGh0bWxfNDEzZTU2NjE0MWM4NDczYjg5NzI5MmIwMTllZjcyM2MpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfODM2OTUxMGFkM2RiNDZkMzk3OGU1ZTA5MmVhNGFkNTYuYmluZFBvcHVwKHBvcHVwXzE3ODQ4NWEwZmQ1ZjQ1MWQ4ZjVjZmJmYzQzMGYzZjc1KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2M3MDY1ZWI5YzcwMTQ4YjM4MDA0ZjFlNWE1ODBiNzhlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzYuMTE4NTk4NjQxOTA4ODYsIDAuNDAzMDYxMDk1NjIzNjYyOV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzk2NDgwZmE1ZTJiYjRiNDk5Yzg0NzIyODNmYzMxOWE5KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8wOGUwZGI1ODBkMDY0YzFmODg5NDI2YjI5ODcyNGI5NyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfMDg1NTJjZWJmNjc0NGNiZTkxM2JkOTcxNWRjOTdhYzIgPSAkKGA8ZGl2IGlkPSJodG1sXzA4NTUyY2ViZjY3NDRjYmU5MTNiZDk3MTVkYzk3YWMyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij40MzwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8wOGUwZGI1ODBkMDY0YzFmODg5NDI2YjI5ODcyNGI5Ny5zZXRDb250ZW50KGh0bWxfMDg1NTJjZWJmNjc0NGNiZTkxM2JkOTcxNWRjOTdhYzIpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYzcwNjVlYjljNzAxNDhiMzgwMDRmMWU1YTU4MGI3OGUuYmluZFBvcHVwKHBvcHVwXzA4ZTBkYjU4MGQwNjRjMWY4ODk0MjZiMjk4NzI0Yjk3KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2NkZDdjOTk3YTllZDQzYmY4OGIxODI5NzlhNzBjZjIxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTkuMzQ3NjIwMTg5MzUyNjQsIDI5LjUxODczNDEwOTM2MDM4OF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzk2NDgwZmE1ZTJiYjRiNDk5Yzg0NzIyODNmYzMxOWE5KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF82YjA1NGZlM2Y4NzA0YTI1OTI2N2MxYjZjNzA0YTNiNyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfZjE2MmQ3ZGI2MzY0NGM5NmJmNmM2YzAyMzlmZGZlZjAgPSAkKGA8ZGl2IGlkPSJodG1sX2YxNjJkN2RiNjM2NDRjOTZiZjZjNmMwMjM5ZmRmZWYwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij40NDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF82YjA1NGZlM2Y4NzA0YTI1OTI2N2MxYjZjNzA0YTNiNy5zZXRDb250ZW50KGh0bWxfZjE2MmQ3ZGI2MzY0NGM5NmJmNmM2YzAyMzlmZGZlZjApOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfY2RkN2M5OTdhOWVkNDNiZjg4YjE4Mjk3OWE3MGNmMjEuYmluZFBvcHVwKHBvcHVwXzZiMDU0ZmUzZjg3MDRhMjU5MjY3YzFiNmM3MDRhM2I3KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzhjNmU0M2U1MmNjNTQ5OTRhNTg5MzY2YzdhNTNmZTk4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuMzg2MzEyMTMwMDU5LCAtMC4xNjc3NDYzMDk3ODk5NTgzXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFya2VyX2NsdXN0ZXJfOTY0ODBmYTVlMmJiNGI0OTljODQ3MjI4M2ZjMzE5YTkpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzcyZGQ3OTgzNGZiMjQzYWM4OTZkODFkZTE1ZTlhNTQ2ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9kNzJjMzRjMjBiODk0NDhiOWU4N2YyZDlhNTdkMzY5OCA9ICQoYDxkaXYgaWQ9Imh0bWxfZDcyYzM0YzIwYjg5NDQ4YjllODdmMmQ5YTU3ZDM2OTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjQ1PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzcyZGQ3OTgzNGZiMjQzYWM4OTZkODFkZTE1ZTlhNTQ2LnNldENvbnRlbnQoaHRtbF9kNzJjMzRjMjBiODk0NDhiOWU4N2YyZDlhNTdkMzY5OCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl84YzZlNDNlNTJjYzU0OTk0YTU4OTM2NmM3YTUzZmU5OC5iaW5kUG9wdXAocG9wdXBfNzJkZDc5ODM0ZmIyNDNhYzg5NmQ4MWRlMTVlOWE1NDYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzU0NTA2ZTBjMDc0NDhjNmE3NmE3NzgzMWNiMTE4NjUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0My4yMDc4NDI1NTExNDIyOSwgLTQuODc2MzQ3Mzc0MzUzNzg5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFya2VyX2NsdXN0ZXJfOTY0ODBmYTVlMmJiNGI0OTljODQ3MjI4M2ZjMzE5YTkpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzQ2NWI2OGM0YjkxYzRiMWViNmMzMTYwYmJjZDMyZDMzID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF84OWQwMDI3YTNhMzk0OWI1YmFhNmVkNTNmMTRlYTQ4ZiA9ICQoYDxkaXYgaWQ9Imh0bWxfODlkMDAyN2EzYTM5NDliNWJhYTZlZDUzZjE0ZWE0OGYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjQ2PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzQ2NWI2OGM0YjkxYzRiMWViNmMzMTYwYmJjZDMyZDMzLnNldENvbnRlbnQoaHRtbF84OWQwMDI3YTNhMzk0OWI1YmFhNmVkNTNmMTRlYTQ4Zik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl83NTQ1MDZlMGMwNzQ0OGM2YTc2YTc3ODMxY2IxMTg2NS5iaW5kUG9wdXAocG9wdXBfNDY1YjY4YzRiOTFjNGIxZWI2YzMxNjBiYmNkMzJkMzMpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMjRkNWJhN2I3YzNlNDRhM2I2NjgwZWYyYzdiZDJkNDQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC4wNjYzOTk3OTU1NjgyMSwgOS4yNzIwMzE3NTY4NjE2MzNdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZGY0NDdmMjJjYTNlNGI1OWIwY2UwOWJiMzMyMWZkODAgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2MwMGE2ZDUxZjY3NTQwYmZiNzkyMmY2YjM3NDk3N2QwID0gJChgPGRpdiBpZD0iaHRtbF9jMDBhNmQ1MWY2NzU0MGJmYjc5MjJmNmIzNzQ5NzdkMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+NDc8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZGY0NDdmMjJjYTNlNGI1OWIwY2UwOWJiMzMyMWZkODAuc2V0Q29udGVudChodG1sX2MwMGE2ZDUxZjY3NTQwYmZiNzkyMmY2YjM3NDk3N2QwKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzI0ZDViYTdiN2MzZTQ0YTNiNjY4MGVmMmM3YmQyZDQ0LmJpbmRQb3B1cChwb3B1cF9kZjQ0N2YyMmNhM2U0YjU5YjBjZTA5YmIzMzIxZmQ4MCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9mYzE5NjlkMDFkYmM0YjMyYTE1NTRkMjlmOTUyYzVjOCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ1LjYwNjU4ODIxODE0NTU3LCAtMTEuMjkyNzU5NzQ5NjYyNDMyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFya2VyX2NsdXN0ZXJfOTY0ODBmYTVlMmJiNGI0OTljODQ3MjI4M2ZjMzE5YTkpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2UyMjg0MmIzMTg3ODQ2NDdhMDhmYWFhNjY0MGQ2ZGVjID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9jODcwN2YyOTE2MDU0YjFkYWM3NjQ2ODhhOTM0MTA1OCA9ICQoYDxkaXYgaWQ9Imh0bWxfYzg3MDdmMjkxNjA1NGIxZGFjNzY0Njg4YTkzNDEwNTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjQ4PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2UyMjg0MmIzMTg3ODQ2NDdhMDhmYWFhNjY0MGQ2ZGVjLnNldENvbnRlbnQoaHRtbF9jODcwN2YyOTE2MDU0YjFkYWM3NjQ2ODhhOTM0MTA1OCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9mYzE5NjlkMDFkYmM0YjMyYTE1NTRkMjlmOTUyYzVjOC5iaW5kUG9wdXAocG9wdXBfZTIyODQyYjMxODc4NDY0N2EwOGZhYWE2NjQwZDZkZWMpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZTBlYmI2YzczZWM3NGVlOWJiMTk3MWI3MzMyMmJiOTggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1OC4yMTc4ODUwNjU4MzQ4LCAyMy4yMzkwNTI1NTUwNzg4MDddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZjBhYmQxNmZjZjRkNGY1MTg5ODk0OTJkZWNjNTQ3YWMgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2ZjNTUwYTA3YWE1ZDQ3ZmU5MDUzNjIwZjRjZTkxYjQ1ID0gJChgPGRpdiBpZD0iaHRtbF9mYzU1MGEwN2FhNWQ0N2ZlOTA1MzYyMGY0Y2U5MWI0NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+NDk8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZjBhYmQxNmZjZjRkNGY1MTg5ODk0OTJkZWNjNTQ3YWMuc2V0Q29udGVudChodG1sX2ZjNTUwYTA3YWE1ZDQ3ZmU5MDUzNjIwZjRjZTkxYjQ1KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2UwZWJiNmM3M2VjNzRlZTliYjE5NzFiNzMzMjJiYjk4LmJpbmRQb3B1cChwb3B1cF9mMGFiZDE2ZmNmNGQ0ZjUxODk4OTQ5MmRlY2M1NDdhYykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9kYzcxMTFiYTUyOTc0YWFiYTc5MTNlOWYzMzgyMGQ1NCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjUxMDgzMzc0MTg0Mzc4LCAxNi4yMjg4ODY5MDQzNjg0Nl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzk2NDgwZmE1ZTJiYjRiNDk5Yzg0NzIyODNmYzMxOWE5KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9iZGE4NThhNWQ3NDU0MjJhODg4YjZmODIzM2E4ZDViOSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfM2EyZmFlNjVhNTZiNDA0YTk0ZGE2ZWZmMjUzZTFlNjkgPSAkKGA8ZGl2IGlkPSJodG1sXzNhMmZhZTY1YTU2YjQwNGE5NGRhNmVmZjI1M2UxZTY5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij41MDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9iZGE4NThhNWQ3NDU0MjJhODg4YjZmODIzM2E4ZDViOS5zZXRDb250ZW50KGh0bWxfM2EyZmFlNjVhNTZiNDA0YTk0ZGE2ZWZmMjUzZTFlNjkpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZGM3MTExYmE1Mjk3NGFhYmE3OTEzZTlmMzM4MjBkNTQuYmluZFBvcHVwKHBvcHVwX2JkYTg1OGE1ZDc0NTQyMmE4ODhiNmY4MjMzYThkNWI5KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2I2ZTc1NDViZGM5MTRmNDA4OTU0MmY5MjM1NzM2ZDgyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuOTAxMTcxOTcwNTk5MDUsIDI0LjU0MDUyNDQ4MDc5OTA4NV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzk2NDgwZmE1ZTJiYjRiNDk5Yzg0NzIyODNmYzMxOWE5KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8wZTk0ZTJhNzc4Yzg0NzIxYWNjNWVlNzI4MzU4ZWFhMyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfOGViNGU2ZjdjOWEwNDA3MTk4OTMzY2I5ZjIxYTZmYjkgPSAkKGA8ZGl2IGlkPSJodG1sXzhlYjRlNmY3YzlhMDQwNzE5ODkzM2NiOWYyMWE2ZmI5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij41MTwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8wZTk0ZTJhNzc4Yzg0NzIxYWNjNWVlNzI4MzU4ZWFhMy5zZXRDb250ZW50KGh0bWxfOGViNGU2ZjdjOWEwNDA3MTk4OTMzY2I5ZjIxYTZmYjkpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYjZlNzU0NWJkYzkxNGY0MDg5NTQyZjkyMzU3MzZkODIuYmluZFBvcHVwKHBvcHVwXzBlOTRlMmE3NzhjODQ3MjFhY2M1ZWU3MjgzNThlYWEzKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzZkNWUwZDhjODFiZTQ4MWJiNWNlZGQ0ODk4MTNhY2FjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDUuMDc5Mjc2MzM2NzY3OTQsIC0wLjM4NTg4MTEzMzM3MjQ5Mjk3XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFya2VyX2NsdXN0ZXJfOTY0ODBmYTVlMmJiNGI0OTljODQ3MjI4M2ZjMzE5YTkpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzQ0NDNiYzA5Mjg1YzQwNmRhMTYyMDg2ZWJmMGVmZTVlID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9jZTI1OTY0MzUyM2U0MWFiYTllMzY5OTM0Y2MwMTUyNSA9ICQoYDxkaXYgaWQ9Imh0bWxfY2UyNTk2NDM1MjNlNDFhYmE5ZTM2OTkzNGNjMDE1MjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjUyPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzQ0NDNiYzA5Mjg1YzQwNmRhMTYyMDg2ZWJmMGVmZTVlLnNldENvbnRlbnQoaHRtbF9jZTI1OTY0MzUyM2U0MWFiYTllMzY5OTM0Y2MwMTUyNSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl82ZDVlMGQ4YzgxYmU0ODFiYjVjZWRkNDg5ODEzYWNhYy5iaW5kUG9wdXAocG9wdXBfNDQ0M2JjMDkyODVjNDA2ZGExNjIwODZlYmYwZWZlNWUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfOTJlYjZkNzY0OTllNDU4ZDlmYWIyYjQ3NzRlNDZlMTUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0Mi41MjI5ODg3NDE0MjkxLCAyLjQ1NjY0OTA4MTg5Mzg5MTNdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNzllYjRkMDU3MmY4NDRlN2FkNDBjNGFhMjU4NGFmZWMgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzk1NjA1N2VkMWE0NDRhOTk4ZDU5NzYzMmYxMTAyYWQyID0gJChgPGRpdiBpZD0iaHRtbF85NTYwNTdlZDFhNDQ0YTk5OGQ1OTc2MzJmMTEwMmFkMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+NTM8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNzllYjRkMDU3MmY4NDRlN2FkNDBjNGFhMjU4NGFmZWMuc2V0Q29udGVudChodG1sXzk1NjA1N2VkMWE0NDRhOTk4ZDU5NzYzMmYxMTAyYWQyKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzkyZWI2ZDc2NDk5ZTQ1OGQ5ZmFiMmI0Nzc0ZTQ2ZTE1LmJpbmRQb3B1cChwb3B1cF83OWViNGQwNTcyZjg0NGU3YWQ0MGM0YWEyNTg0YWZlYykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl80N2M0ZGQ3ZTJiYzE0ZTQ1YjdkYmMxY2FiYzMzYTY3NyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM2Ljk3NjE4NTQ5MTk1MDc1LCAxMi4xMDMwODAxMTIxMDY2MDddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfY2RhODMwNGJmNWMyNDllYWJkZjllZmViNzJmZjA0NGMgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzQxZmJjNGU5ZWE3OTQyYmY5M2E3ZjA1ZDA5MmNmMDg3ID0gJChgPGRpdiBpZD0iaHRtbF80MWZiYzRlOWVhNzk0MmJmOTNhN2YwNWQwOTJjZjA4NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+NTQ8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfY2RhODMwNGJmNWMyNDllYWJkZjllZmViNzJmZjA0NGMuc2V0Q29udGVudChodG1sXzQxZmJjNGU5ZWE3OTQyYmY5M2E3ZjA1ZDA5MmNmMDg3KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzQ3YzRkZDdlMmJjMTRlNDViN2RiYzFjYWJjMzNhNjc3LmJpbmRQb3B1cChwb3B1cF9jZGE4MzA0YmY1YzI0OWVhYmRmOWVmZWI3MmZmMDQ0YykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8xYzJjZTAwMmYxMzM0YTQzYWRhZDY2NWQxMTQ2NjVkZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjE2MTg1MzE4NDQ5MDczLCAyLjMxMjQ3Mjk1MTE3MTkxOTVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNzFjNmFmN2NmYjIwNGNkZDgzN2IwZWMzN2U5YTZlNTQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzA1NWQ4MjgxZGIxODRlMmFhZDUwZjFjNWU3YzZiNThjID0gJChgPGRpdiBpZD0iaHRtbF8wNTVkODI4MWRiMTg0ZTJhYWQ1MGYxYzVlN2M2YjU4YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+NTU8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNzFjNmFmN2NmYjIwNGNkZDgzN2IwZWMzN2U5YTZlNTQuc2V0Q29udGVudChodG1sXzA1NWQ4MjgxZGIxODRlMmFhZDUwZjFjNWU3YzZiNThjKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzFjMmNlMDAyZjEzMzRhNDNhZGFkNjY1ZDExNDY2NWRlLmJpbmRQb3B1cChwb3B1cF83MWM2YWY3Y2ZiMjA0Y2RkODM3YjBlYzM3ZTlhNmU1NCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl82NzdmOWE5Zjk4OTE0NmYyYmU0N2M1NzczZmIyYTExZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQyLjIwNzQ1Nzc1MDM1ODg3LCAxOC42Mzg5NDkxMTcwNzM0NjZdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfOGNhNjk3NmNkZmQ2NDJlMzg1YjU4YWJlZmJkNDQxZTMgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzI3MmY3ZDkyYWJlNTRjYWM4ZmY2Yjc2MWQzMGMyMWIyID0gJChgPGRpdiBpZD0iaHRtbF8yNzJmN2Q5MmFiZTU0Y2FjOGZmNmI3NjFkMzBjMjFiMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+NTY8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfOGNhNjk3NmNkZmQ2NDJlMzg1YjU4YWJlZmJkNDQxZTMuc2V0Q29udGVudChodG1sXzI3MmY3ZDkyYWJlNTRjYWM4ZmY2Yjc2MWQzMGMyMWIyKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzY3N2Y5YTlmOTg5MTQ2ZjJiZTQ3YzU3NzNmYjJhMTFkLmJpbmRQb3B1cChwb3B1cF84Y2E2OTc2Y2RmZDY0MmUzODViNThhYmVmYmQ0NDFlMykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9jMzI1MTI4ODNjOTM0MzFmOTUwNjg1NzNmZTc0ZjY5MyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzU2LjU2MTM3ODI5MzEwMTgyNSwgLTUuOTQ3OTk5MjI2OTc1ODE5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFya2VyX2NsdXN0ZXJfOTY0ODBmYTVlMmJiNGI0OTljODQ3MjI4M2ZjMzE5YTkpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2Q1MzVmNDI2YmE5ZDRjYzA5NGM2NzE3YTQxZmFkYjFiID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF85YzcyN2MyZTE0ZGQ0NGMzYjZjNWMyMjFhNDA2NDMxYiA9ICQoYDxkaXYgaWQ9Imh0bWxfOWM3MjdjMmUxNGRkNDRjM2I2YzVjMjIxYTQwNjQzMWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjU3PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2Q1MzVmNDI2YmE5ZDRjYzA5NGM2NzE3YTQxZmFkYjFiLnNldENvbnRlbnQoaHRtbF85YzcyN2MyZTE0ZGQ0NGMzYjZjNWMyMjFhNDA2NDMxYik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9jMzI1MTI4ODNjOTM0MzFmOTUwNjg1NzNmZTc0ZjY5My5iaW5kUG9wdXAocG9wdXBfZDUzNWY0MjZiYTlkNGNjMDk0YzY3MTdhNDFmYWRiMWIpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYThmZDVhMzgyZTNiNDUwNGI4YjUzOTljYjljNDI2OGIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1Mi41MzI4OTYzMjE2Mjk1OCwgMS4wNjY0MTgyMjI4NjczNDgyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFya2VyX2NsdXN0ZXJfOTY0ODBmYTVlMmJiNGI0OTljODQ3MjI4M2ZjMzE5YTkpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2I0YmViMTA2MzE0NTQxOGI4ZDFlZWVkMzU4NWJjYzhhID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9jNzZhYWU5ZGQwZTY0Y2JiYjEzNzUyM2UwZGE0YmE5NyA9ICQoYDxkaXYgaWQ9Imh0bWxfYzc2YWFlOWRkMGU2NGNiYmIxMzc1MjNlMGRhNGJhOTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjU4PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2I0YmViMTA2MzE0NTQxOGI4ZDFlZWVkMzU4NWJjYzhhLnNldENvbnRlbnQoaHRtbF9jNzZhYWU5ZGQwZTY0Y2JiYjEzNzUyM2UwZGE0YmE5Nyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9hOGZkNWEzODJlM2I0NTA0YjhiNTM5OWNiOWM0MjY4Yi5iaW5kUG9wdXAocG9wdXBfYjRiZWIxMDYzMTQ1NDE4YjhkMWVlZWQzNTg1YmNjOGEpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfM2IwNzU4Yzk0MjVmNDBiMjg4NjA3N2U0ZmFjNzc0NTggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1Ny40NzM0NDc4MzU3NzMxNCwgNy4zMDc4MjI5MjUwNTgxNDRdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYTNhZjQ2OWU5ZjJjNGZkM2I4ZGY4NmY2NGVhODMzNDAgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzI3OWQwZTdhN2QwMTRlYjQ4MDk5OGVkMGVlNjZkZTM2ID0gJChgPGRpdiBpZD0iaHRtbF8yNzlkMGU3YTdkMDE0ZWI0ODA5OThlZDBlZTY2ZGUzNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+NTk8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYTNhZjQ2OWU5ZjJjNGZkM2I4ZGY4NmY2NGVhODMzNDAuc2V0Q29udGVudChodG1sXzI3OWQwZTdhN2QwMTRlYjQ4MDk5OGVkMGVlNjZkZTM2KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzNiMDc1OGM5NDI1ZjQwYjI4ODYwNzdlNGZhYzc3NDU4LmJpbmRQb3B1cChwb3B1cF9hM2FmNDY5ZTlmMmM0ZmQzYjhkZjg2ZjY0ZWE4MzM0MCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl84ODRkOGZhODJmNDc0ODU0ODk2ZDkyYjU3ZWI0OWM0ZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzU0LjQ2MzY0MjQyODg4OTgxLCAtNS45MDcyNDc4MzE4NzIyMzNdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNDVkZTg2YjhhMzdmNDFlY2JmNzgzNTZlOTlhMmM3NDUgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzc0ZjdkMzA4MTEwYTRkNTJhOThkZTllNDMzMTQ0MDEwID0gJChgPGRpdiBpZD0iaHRtbF83NGY3ZDMwODExMGE0ZDUyYTk4ZGU5ZTQzMzE0NDAxMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+NjA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNDVkZTg2YjhhMzdmNDFlY2JmNzgzNTZlOTlhMmM3NDUuc2V0Q29udGVudChodG1sXzc0ZjdkMzA4MTEwYTRkNTJhOThkZTllNDMzMTQ0MDEwKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzg4NGQ4ZmE4MmY0NzQ4NTQ4OTZkOTJiNTdlYjQ5YzRlLmJpbmRQb3B1cChwb3B1cF80NWRlODZiOGEzN2Y0MWVjYmY3ODM1NmU5OWEyYzc0NSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9hMzBjNTUyM2UxMWY0YmFjYmJiNTM4NDkwZWEyY2UzNSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzU3LjIwODAyODg3Nzk2OTQ1NCwgMjYuMzIyNDIzNzI0MTMzNTg2XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFya2VyX2NsdXN0ZXJfOTY0ODBmYTVlMmJiNGI0OTljODQ3MjI4M2ZjMzE5YTkpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2JjNmQ2YTExNjE2MzQ4MmM4OTFmMjNiMThmNDM0ZGZlID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF83OGY2ZTgwMmM3NWM0MWZhYjg0NDQ3ZjI4MDNjM2RkNyA9ICQoYDxkaXYgaWQ9Imh0bWxfNzhmNmU4MDJjNzVjNDFmYWI4NDQ0N2YyODAzYzNkZDciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjYxPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2JjNmQ2YTExNjE2MzQ4MmM4OTFmMjNiMThmNDM0ZGZlLnNldENvbnRlbnQoaHRtbF83OGY2ZTgwMmM3NWM0MWZhYjg0NDQ3ZjI4MDNjM2RkNyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9hMzBjNTUyM2UxMWY0YmFjYmJiNTM4NDkwZWEyY2UzNS5iaW5kUG9wdXAocG9wdXBfYmM2ZDZhMTE2MTYzNDgyYzg5MWYyM2IxOGY0MzRkZmUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMDJiMGZjZTE0OWNlNDgxZWI5Y2QzMjUxZTJhMTRmNmUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS4wODE3Njg5OTI2OTU2NiwgMjEuOTg1MjcxMDE0NTYzMDMzXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFya2VyX2NsdXN0ZXJfOTY0ODBmYTVlMmJiNGI0OTljODQ3MjI4M2ZjMzE5YTkpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzU5ZTA5NTAyZmQ4NTRkZDk5ZGE4MGIxZDAyMzQ1ODJjID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9iNDJjOGFiODY2NWI0MjVkYjg2MTQ0ZmFjYWNkM2FjYSA9ICQoYDxkaXYgaWQ9Imh0bWxfYjQyYzhhYjg2NjViNDI1ZGI4NjE0NGZhY2FjZDNhY2EiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjYyPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzU5ZTA5NTAyZmQ4NTRkZDk5ZGE4MGIxZDAyMzQ1ODJjLnNldENvbnRlbnQoaHRtbF9iNDJjOGFiODY2NWI0MjVkYjg2MTQ0ZmFjYWNkM2FjYSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8wMmIwZmNlMTQ5Y2U0ODFlYjljZDMyNTFlMmExNGY2ZS5iaW5kUG9wdXAocG9wdXBfNTllMDk1MDJmZDg1NGRkOTlkYTgwYjFkMDIzNDU4MmMpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTQ5NzEyMDhiZGEyNGYxMDg0ODU4ZTEyZTg2MzVhOTYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0NC43MzkzNTc4Nzc5MTYwOSwgMjAuNDI2MzE3MDU1NTEyNjc2XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFya2VyX2NsdXN0ZXJfOTY0ODBmYTVlMmJiNGI0OTljODQ3MjI4M2ZjMzE5YTkpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzY4ZWUxODFkOGViYzRkNTA4ZWY1MmQyN2U0ZDY2ZTEwID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF83MzgzMThiMWJkM2Y0Yjk3YmZmY2ViMmMwMDcyNDlmOSA9ICQoYDxkaXYgaWQ9Imh0bWxfNzM4MzE4YjFiZDNmNGI5N2JmZmNlYjJjMDA3MjQ5ZjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjYzPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzY4ZWUxODFkOGViYzRkNTA4ZWY1MmQyN2U0ZDY2ZTEwLnNldENvbnRlbnQoaHRtbF83MzgzMThiMWJkM2Y0Yjk3YmZmY2ViMmMwMDcyNDlmOSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl81NDk3MTIwOGJkYTI0ZjEwODQ4NThlMTJlODYzNWE5Ni5iaW5kUG9wdXAocG9wdXBfNjhlZTE4MWQ4ZWJjNGQ1MDhlZjUyZDI3ZTRkNjZlMTApCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTk0NjMwOWNjM2FkNGZkODhmOGVjMzc5MWRmNGM2OGIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjQ3MDQxNDcwNTM2LCAtMTEuODQ0NDEyNjgzMDMxODk2XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFya2VyX2NsdXN0ZXJfOTY0ODBmYTVlMmJiNGI0OTljODQ3MjI4M2ZjMzE5YTkpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzg5N2M0ZTEyY2ZlZTQ4OTI4MDg0Y2VhYTFjNGQxYWFhID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF80MmUzNjc5NmE2ZDM0MDI5YTZkNTg0YzVmZWIyM2ExYSA9ICQoYDxkaXYgaWQ9Imh0bWxfNDJlMzY3OTZhNmQzNDAyOWE2ZDU4NGM1ZmViMjNhMWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjY0PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzg5N2M0ZTEyY2ZlZTQ4OTI4MDg0Y2VhYTFjNGQxYWFhLnNldENvbnRlbnQoaHRtbF80MmUzNjc5NmE2ZDM0MDI5YTZkNTg0YzVmZWIyM2ExYSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl81OTQ2MzA5Y2MzYWQ0ZmQ4OGY4ZWMzNzkxZGY0YzY4Yi5iaW5kUG9wdXAocG9wdXBfODk3YzRlMTJjZmVlNDg5MjgwODRjZWFhMWM0ZDFhYWEpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMzM0NzBkYjkwNzZiNDA5OTkyYjZlMTZlNDdlODIxODIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1Ny4zMjMxMTM5NjM2NzEyMDQsIDE3LjE1NzEzMTAwMzM1Njg0XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFya2VyX2NsdXN0ZXJfOTY0ODBmYTVlMmJiNGI0OTljODQ3MjI4M2ZjMzE5YTkpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzY5YzhjMmUyMGZmZjRhMDA5YzU1NzMwMTRiOTMyYTE2ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF82OWQ1ZDI3NWI0MGY0ODFkYjE1MTAyYmRkMjYzYzU3ZiA9ICQoYDxkaXYgaWQ9Imh0bWxfNjlkNWQyNzViNDBmNDgxZGIxNTEwMmJkZDI2M2M1N2YiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjY1PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzY5YzhjMmUyMGZmZjRhMDA5YzU1NzMwMTRiOTMyYTE2LnNldENvbnRlbnQoaHRtbF82OWQ1ZDI3NWI0MGY0ODFkYjE1MTAyYmRkMjYzYzU3Zik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8zMzQ3MGRiOTA3NmI0MDk5OTJiNmUxNmU0N2U4MjE4Mi5iaW5kUG9wdXAocG9wdXBfNjljOGMyZTIwZmZmNGEwMDljNTU3MzAxNGI5MzJhMTYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfODdlNjk4NTdkMzc1NDliOWI2Y2MyMTBiMTNlYmI1NTMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1Mi4wMzE4MjQxNDA0ODA2MiwgLTUuNTY0MzI2NDU4NjE3ODZdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfODAxMjJiZDY2ZGRiNDM4NTg4NTFmNzFhMmZmMGRiMWUgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzcxMGM4ODc4OWFlNjQxMjY4NGY1ODNmMTY3OTEzNzBmID0gJChgPGRpdiBpZD0iaHRtbF83MTBjODg3ODlhZTY0MTI2ODRmNTgzZjE2NzkxMzcwZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+NjY8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfODAxMjJiZDY2ZGRiNDM4NTg4NTFmNzFhMmZmMGRiMWUuc2V0Q29udGVudChodG1sXzcxMGM4ODc4OWFlNjQxMjY4NGY1ODNmMTY3OTEzNzBmKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzg3ZTY5ODU3ZDM3NTQ5YjliNmNjMjEwYjEzZWJiNTUzLmJpbmRQb3B1cChwb3B1cF84MDEyMmJkNjZkZGI0Mzg1ODg1MWY3MWEyZmYwZGIxZSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8zY2Q1MzU4Yjk0YTk0OTAwOWE1MjA0MjhjMDM3ZjAyZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ2LjQ3MTQyODIwNTIwNzg0LCAxMi42NTc4ODI1MzI1Mzc3OV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzk2NDgwZmE1ZTJiYjRiNDk5Yzg0NzIyODNmYzMxOWE5KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8zNDU4Njg4NjE2OWI0N2VhYThhYzBmNTc3OTZkZTVkNyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfOGI2YjBiNzk4MDZjNDBiZjkxNzYzMDQ3MGVmZTVmMjMgPSAkKGA8ZGl2IGlkPSJodG1sXzhiNmIwYjc5ODA2YzQwYmY5MTc2MzA0NzBlZmU1ZjIzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij42NzwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8zNDU4Njg4NjE2OWI0N2VhYThhYzBmNTc3OTZkZTVkNy5zZXRDb250ZW50KGh0bWxfOGI2YjBiNzk4MDZjNDBiZjkxNzYzMDQ3MGVmZTVmMjMpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfM2NkNTM1OGI5NGE5NDkwMDlhNTIwNDI4YzAzN2YwMmYuYmluZFBvcHVwKHBvcHVwXzM0NTg2ODg2MTY5YjQ3ZWFhOGFjMGY1Nzc5NmRlNWQ3KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2M0YzA2M2YxYTIzNDQ2NjE5ZjFmMjNmYWM1N2M2MjAwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuMjM3MzA5NDAzMjY0OTQ1LCAyMC40NjM3OTc5OTQ3NzI0MzVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNzAyYTNlMjgwYTY1NDU2ZTk2OWM4NWMzYmVmMGU5YWMgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzI4MGNjZDIzNjQ3ZTQ0YzY5ZTM0NmU5ZWNiYjI4NTRmID0gJChgPGRpdiBpZD0iaHRtbF8yODBjY2QyMzY0N2U0NGM2OWUzNDZlOWVjYmIyODU0ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Njg8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNzAyYTNlMjgwYTY1NDU2ZTk2OWM4NWMzYmVmMGU5YWMuc2V0Q29udGVudChodG1sXzI4MGNjZDIzNjQ3ZTQ0YzY5ZTM0NmU5ZWNiYjI4NTRmKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2M0YzA2M2YxYTIzNDQ2NjE5ZjFmMjNmYWM1N2M2MjAwLmJpbmRQb3B1cChwb3B1cF83MDJhM2UyODBhNjU0NTZlOTY5Yzg1YzNiZWYwZTlhYykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9iYWMzOTRhODBmODY0NDE4OGE0ZWQ0MzUyYzVhYmJkNSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUzLjY0MjUzOTQ4MDEzNjU5LCAtMC4wNTkyMDg5MjU1NjE0MzU0Ml0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzk2NDgwZmE1ZTJiYjRiNDk5Yzg0NzIyODNmYzMxOWE5KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9kMTc2NmI5OGIxMmY0ZWU2Yjc0NmQwZDA2OGZjNzczZSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfMWZlY2E4YTQ2OTg2NGY3OWE1NmJlYmQ3MGRkYmE2NTkgPSAkKGA8ZGl2IGlkPSJodG1sXzFmZWNhOGE0Njk4NjRmNzlhNTZiZWJkNzBkZGJhNjU5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij42OTwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9kMTc2NmI5OGIxMmY0ZWU2Yjc0NmQwZDA2OGZjNzczZS5zZXRDb250ZW50KGh0bWxfMWZlY2E4YTQ2OTg2NGY3OWE1NmJlYmQ3MGRkYmE2NTkpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYmFjMzk0YTgwZjg2NDQxODhhNGVkNDM1MmM1YWJiZDUuYmluZFBvcHVwKHBvcHVwX2QxNzY2Yjk4YjEyZjRlZTZiNzQ2ZDBkMDY4ZmM3NzNlKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2JjNTEzNmZjODZjNTRjZjViZGRiOTU1ZGYxODQ5ZmJjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDYuMTc5NTg5NjQzMzMwOTEsIDIyLjYxODk1NzIzMjkxMDY5NV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzk2NDgwZmE1ZTJiYjRiNDk5Yzg0NzIyODNmYzMxOWE5KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF84NTgzMGVmNGViMjk0ZDM1YWExYjNhY2UxN2Y2NmJiNSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfNWQwODExMTM5ZjJjNDBhMzg0YjAzMDM4Y2UzYmRkZTMgPSAkKGA8ZGl2IGlkPSJodG1sXzVkMDgxMTEzOWYyYzQwYTM4NGIwMzAzOGNlM2JkZGUzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij43MDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF84NTgzMGVmNGViMjk0ZDM1YWExYjNhY2UxN2Y2NmJiNS5zZXRDb250ZW50KGh0bWxfNWQwODExMTM5ZjJjNDBhMzg0YjAzMDM4Y2UzYmRkZTMpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYmM1MTM2ZmM4NmM1NGNmNWJkZGI5NTVkZjE4NDlmYmMuYmluZFBvcHVwKHBvcHVwXzg1ODMwZWY0ZWIyOTRkMzVhYTFiM2FjZTE3ZjY2YmI1KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2M3ODNlZjUxOGUxZjQ1N2FiNjEwM2ExMDZjOWMzMDcxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTQuODA0MDI1NjUyNDYxMTgsIDI1LjA3Njc0NTM2MzU5ODQ4NF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzk2NDgwZmE1ZTJiYjRiNDk5Yzg0NzIyODNmYzMxOWE5KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8yNjg4NTVkZjMyMzY0Y2VkYTc2NmUwZWJhYmMyYmQ5MSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfYjA4M2I5YmI5NDJmNGRlZmE5OWM1NjQ3NDNiMjhkODUgPSAkKGA8ZGl2IGlkPSJodG1sX2IwODNiOWJiOTQyZjRkZWZhOTljNTY0NzQzYjI4ZDg1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij43MTwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8yNjg4NTVkZjMyMzY0Y2VkYTc2NmUwZWJhYmMyYmQ5MS5zZXRDb250ZW50KGh0bWxfYjA4M2I5YmI5NDJmNGRlZmE5OWM1NjQ3NDNiMjhkODUpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYzc4M2VmNTE4ZTFmNDU3YWI2MTAzYTEwNmM5YzMwNzEuYmluZFBvcHVwKHBvcHVwXzI2ODg1NWRmMzIzNjRjZWRhNzY2ZTBlYmFiYzJiZDkxKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2E3NjhmOWEyZDMxZTRjYTBhYmVmMTE0OTc5Njk1NjhmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDEuNTA5Njg5OTY3OTgxNTMsIC02LjA3MTI0NDc3MzU5NjkwNl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzk2NDgwZmE1ZTJiYjRiNDk5Yzg0NzIyODNmYzMxOWE5KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9lZDQ1MDc0NDVmZmM0YmYzYjAxMDVhMmRmMmQwM2RlMyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfOWY0OWJkYTc3MDJlNDY2ZGIyN2JkMTJjYWMyMjY1YzEgPSAkKGA8ZGl2IGlkPSJodG1sXzlmNDliZGE3NzAyZTQ2NmRiMjdiZDEyY2FjMjI2NWMxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij43MjwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9lZDQ1MDc0NDVmZmM0YmYzYjAxMDVhMmRmMmQwM2RlMy5zZXRDb250ZW50KGh0bWxfOWY0OWJkYTc3MDJlNDY2ZGIyN2JkMTJjYWMyMjY1YzEpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYTc2OGY5YTJkMzFlNGNhMGFiZWYxMTQ5Nzk2OTU2OGYuYmluZFBvcHVwKHBvcHVwX2VkNDUwNzQ0NWZmYzRiZjNiMDEwNWEyZGYyZDAzZGUzKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzQ0YTNlOTY1NmIwNjQ4ZDVhYjcxYTc5YmY5ODNiNTZlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuODg1MDM5MTg5MTM4NjY2LCAtOS40NjgwMDI0NDI3MjA0MTddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNGRlM2UxZDA5OWZiNGVmYjgzOWQwZWQ0NWY4Zjk2NTEgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2FjNmQwNzk0MmI4YzQzZjg5MTZiNjNhNDg3OTdmYzBlID0gJChgPGRpdiBpZD0iaHRtbF9hYzZkMDc5NDJiOGM0M2Y4OTE2YjYzYTQ4Nzk3ZmMwZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+NzM8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNGRlM2UxZDA5OWZiNGVmYjgzOWQwZWQ0NWY4Zjk2NTEuc2V0Q29udGVudChodG1sX2FjNmQwNzk0MmI4YzQzZjg5MTZiNjNhNDg3OTdmYzBlKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzQ0YTNlOTY1NmIwNjQ4ZDVhYjcxYTc5YmY5ODNiNTZlLmJpbmRQb3B1cChwb3B1cF80ZGUzZTFkMDk5ZmI0ZWZiODM5ZDBlZDQ1ZjhmOTY1MSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9lMDE4Njc4ODM1ZTM0MmRhOWZjZThlZDRjODUxOWYxNCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjY4Njc2OTk4NDE3ODUxLCAyNy44ODUzNTIwMjg3NzY4MjJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMjVlNDc5NWU3ZWJjNGZiMjhkYzEyMTZhNTA4YjdiOTYgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzAwY2Y2NTMxOTI5ZTRmN2ZhNjAwYjc3MzZlNzhiODI0ID0gJChgPGRpdiBpZD0iaHRtbF8wMGNmNjUzMTkyOWU0ZjdmYTYwMGI3NzM2ZTc4YjgyNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+NzQ8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMjVlNDc5NWU3ZWJjNGZiMjhkYzEyMTZhNTA4YjdiOTYuc2V0Q29udGVudChodG1sXzAwY2Y2NTMxOTI5ZTRmN2ZhNjAwYjc3MzZlNzhiODI0KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2UwMTg2Nzg4MzVlMzQyZGE5ZmNlOGVkNGM4NTE5ZjE0LmJpbmRQb3B1cChwb3B1cF8yNWU0Nzk1ZTdlYmM0ZmIyOGRjMTIxNmE1MDhiN2I5NikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9lNzU4Y2Q0MTM4Yzc0MGY0YjRkYTU2ZTA1YmVlZDA1YyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1Ljg3MjEyMTg4ODUzODcxNSwgNy4zNTI2NzU5NDczMDIzNDVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYTQ2NTE0NzYzZGI4NDM5Y2JkNTM2MDM2NmVhZDEzZjcgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2NlYzA4NTNhODI3OTRiMzViMDhhZTJiZWExMzgzZTI4ID0gJChgPGRpdiBpZD0iaHRtbF9jZWMwODUzYTgyNzk0YjM1YjA4YWUyYmVhMTM4M2UyOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+NzU8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYTQ2NTE0NzYzZGI4NDM5Y2JkNTM2MDM2NmVhZDEzZjcuc2V0Q29udGVudChodG1sX2NlYzA4NTNhODI3OTRiMzViMDhhZTJiZWExMzgzZTI4KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2U3NThjZDQxMzhjNzQwZjRiNGRhNTZlMDViZWVkMDVjLmJpbmRQb3B1cChwb3B1cF9hNDY1MTQ3NjNkYjg0MzljYmQ1MzYwMzY2ZWFkMTNmNykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8yNmExZTkyZjU1ODg0ZDE2OTNhYzVlOGM4NzAxNTY1NCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg0NDMwNzM3NTM2NDE5LCA2LjQyMDM5OTkyNTg5MTI3MV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzk2NDgwZmE1ZTJiYjRiNDk5Yzg0NzIyODNmYzMxOWE5KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8wNzcyNzU4MDlhMDE0MTRlYTk3MGNkOGEzMzEyNWJiMiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfZGZjOWEyYzdlYTQ5NDI1NmFmMjQwMjI5NTkzZjkyZjMgPSAkKGA8ZGl2IGlkPSJodG1sX2RmYzlhMmM3ZWE0OTQyNTZhZjI0MDIyOTU5M2Y5MmYzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij43NjwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8wNzcyNzU4MDlhMDE0MTRlYTk3MGNkOGEzMzEyNWJiMi5zZXRDb250ZW50KGh0bWxfZGZjOWEyYzdlYTQ5NDI1NmFmMjQwMjI5NTkzZjkyZjMpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMjZhMWU5MmY1NTg4NGQxNjkzYWM1ZThjODcwMTU2NTQuYmluZFBvcHVwKHBvcHVwXzA3NzI3NTgwOWEwMTQxNGVhOTcwY2Q4YTMzMTI1YmIyKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzgzZWMwZjM1ZWEwYzQyZTQ4YTk3YzA4YzY4OTgzMjY0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDEuOTA4MTE1NDk5MDM3MDksIDQuODQ2NDg0NTU4MDczODI2XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFya2VyX2NsdXN0ZXJfOTY0ODBmYTVlMmJiNGI0OTljODQ3MjI4M2ZjMzE5YTkpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2YyYWQ1ZTQ4ZWE5MDRmMzlhNDEyNGY0ZWIyYTJiMTg2ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9hODhkNjY2NDMzZjg0MTI3YjE2MGE4MjUwOTg1YmJiMCA9ICQoYDxkaXYgaWQ9Imh0bWxfYTg4ZDY2NjQzM2Y4NDEyN2IxNjBhODI1MDk4NWJiYjAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjc3PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2YyYWQ1ZTQ4ZWE5MDRmMzlhNDEyNGY0ZWIyYTJiMTg2LnNldENvbnRlbnQoaHRtbF9hODhkNjY2NDMzZjg0MTI3YjE2MGE4MjUwOTg1YmJiMCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl84M2VjMGYzNWVhMGM0MmU0OGE5N2MwOGM2ODk4MzI2NC5iaW5kUG9wdXAocG9wdXBfZjJhZDVlNDhlYTkwNGYzOWE0MTI0ZjRlYjJhMmIxODYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYzllNjRlNjJhYTlmNDI4ZTgwMWQ5MzllOGU1NDdhM2IgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszOC45NjI2MDc3Mzc3NDQ0NiwgMC40Mjg0NDQ4NzUzMTMzNzgwNV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzk2NDgwZmE1ZTJiYjRiNDk5Yzg0NzIyODNmYzMxOWE5KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8zZjQyOTEzZjI5M2E0Zjk0ODZiNTI3M2JiYTM4N2UyOCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfZTU2ZjViZjI3YzQ3NDU3YmIyMGYxYmZkNGNkNjM2ZmEgPSAkKGA8ZGl2IGlkPSJodG1sX2U1NmY1YmYyN2M0NzQ1N2JiMjBmMWJmZDRjZDYzNmZhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij43ODwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8zZjQyOTEzZjI5M2E0Zjk0ODZiNTI3M2JiYTM4N2UyOC5zZXRDb250ZW50KGh0bWxfZTU2ZjViZjI3YzQ3NDU3YmIyMGYxYmZkNGNkNjM2ZmEpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYzllNjRlNjJhYTlmNDI4ZTgwMWQ5MzllOGU1NDdhM2IuYmluZFBvcHVwKHBvcHVwXzNmNDI5MTNmMjkzYTRmOTQ4NmI1MjczYmJhMzg3ZTI4KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzQ1ZDMyYWVkODllMjQwYmRiZGVhZjVkY2ZhNTM5NjMxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODk0OTkxNDMwNDI4MTcsIC01LjkyMjU5Njc2Nzc5OTczMV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzk2NDgwZmE1ZTJiYjRiNDk5Yzg0NzIyODNmYzMxOWE5KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF85NmVjYzI2M2YzYTk0NjlmYjFjZjQzMTQwMzU5YzExNSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfNTE4MzRkMjc3YjBiNGM5ZGEyY2RiMThjN2RiNzVlMTUgPSAkKGA8ZGl2IGlkPSJodG1sXzUxODM0ZDI3N2IwYjRjOWRhMmNkYjE4YzdkYjc1ZTE1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij43OTwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF85NmVjYzI2M2YzYTk0NjlmYjFjZjQzMTQwMzU5YzExNS5zZXRDb250ZW50KGh0bWxfNTE4MzRkMjc3YjBiNGM5ZGEyY2RiMThjN2RiNzVlMTUpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNDVkMzJhZWQ4OWUyNDBiZGJkZWFmNWRjZmE1Mzk2MzEuYmluZFBvcHVwKHBvcHVwXzk2ZWNjMjYzZjNhOTQ2OWZiMWNmNDMxNDAzNTljMTE1KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2MyOTg2N2ViZjE1NjQxZGZiOWMxMDYzNzZkODMwMGE1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDguNzI5MTU0MzczMDYzOTcsIDE5LjUwOTQ3MDEzMTQyMTY4M10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzk2NDgwZmE1ZTJiYjRiNDk5Yzg0NzIyODNmYzMxOWE5KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF85MTdlYmZmMDgzM2I0MTkxOGFjMGQ1OWRlN2JkMjU1NiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfZDc5Y2QxY2M4YTdjNGQ3MTg1ZTlmODA4MTJhZDU0YTQgPSAkKGA8ZGl2IGlkPSJodG1sX2Q3OWNkMWNjOGE3YzRkNzE4NWU5ZjgwODEyYWQ1NGE0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij44MDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF85MTdlYmZmMDgzM2I0MTkxOGFjMGQ1OWRlN2JkMjU1Ni5zZXRDb250ZW50KGh0bWxfZDc5Y2QxY2M4YTdjNGQ3MTg1ZTlmODA4MTJhZDU0YTQpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYzI5ODY3ZWJmMTU2NDFkZmI5YzEwNjM3NmQ4MzAwYTUuYmluZFBvcHVwKHBvcHVwXzkxN2ViZmYwODMzYjQxOTE4YWMwZDU5ZGU3YmQyNTU2KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzg1NGIzYmU2Y2MzMjQ2ZmU4YWI2MTk3YmViNzAxMGQzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuMDMyMDYxMDA1OTA2MDQ0LCAtMC4zODE3MjUxNzY0MTY3ODY0XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFya2VyX2NsdXN0ZXJfOTY0ODBmYTVlMmJiNGI0OTljODQ3MjI4M2ZjMzE5YTkpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzJjZjQwYTA2MTI2ZDQ5ZDk4NTljMzUzNmFjYzZmM2NmID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF80ZmYxYTM0NGZkYjM0Y2IzODUxM2FjODU4YjYyM2Y5MyA9ICQoYDxkaXYgaWQ9Imh0bWxfNGZmMWEzNDRmZGIzNGNiMzg1MTNhYzg1OGI2MjNmOTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjgxPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzJjZjQwYTA2MTI2ZDQ5ZDk4NTljMzUzNmFjYzZmM2NmLnNldENvbnRlbnQoaHRtbF80ZmYxYTM0NGZkYjM0Y2IzODUxM2FjODU4YjYyM2Y5Myk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl84NTRiM2JlNmNjMzI0NmZlOGFiNjE5N2JlYjcwMTBkMy5iaW5kUG9wdXAocG9wdXBfMmNmNDBhMDYxMjZkNDlkOTg1OWMzNTM2YWNjNmYzY2YpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfY2Q3OGEzYWFmN2I0NDY4NzgzNzNhMzI1NDk1ZGNmOTggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0NS4zMDk5MzE2NzYwNzY2LCAyNi45NTQ4OTIwMDg1MDcxOTRdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNjkyN2RkYmE5ZDViNDg1ODk3NzRiNTZmYzQyY2Q2NjYgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzcxNDliYTNiODZiZTQ2ZTc4YzA1ZDQ5YTUzY2ZjNTJhID0gJChgPGRpdiBpZD0iaHRtbF83MTQ5YmEzYjg2YmU0NmU3OGMwNWQ0OWE1M2NmYzUyYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ODI8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNjkyN2RkYmE5ZDViNDg1ODk3NzRiNTZmYzQyY2Q2NjYuc2V0Q29udGVudChodG1sXzcxNDliYTNiODZiZTQ2ZTc4YzA1ZDQ5YTUzY2ZjNTJhKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2NkNzhhM2FhZjdiNDQ2ODc4MzczYTMyNTQ5NWRjZjk4LmJpbmRQb3B1cChwb3B1cF82OTI3ZGRiYTlkNWI0ODU4OTc3NGI1NmZjNDJjZDY2NikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8zNTdiNWE2NGZkNzE0OGZhOGMyZDIwMTBmNzg2ODc1YyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjkyNjk0MjYxMDg0MDUzLCAxMy45ODU5OTc2MDg3OTE0NjhdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMTA2OGZlN2ZiODVhNGRjNWI0YWVjZjUzOTVkM2JiYjIgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzMxZDdlMjAyODVmNDRlMzZhNDEyM2M0MDE0ZDAwYmU4ID0gJChgPGRpdiBpZD0iaHRtbF8zMWQ3ZTIwMjg1ZjQ0ZTM2YTQxMjNjNDAxNGQwMGJlOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ODM8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMTA2OGZlN2ZiODVhNGRjNWI0YWVjZjUzOTVkM2JiYjIuc2V0Q29udGVudChodG1sXzMxZDdlMjAyODVmNDRlMzZhNDEyM2M0MDE0ZDAwYmU4KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzM1N2I1YTY0ZmQ3MTQ4ZmE4YzJkMjAxMGY3ODY4NzVjLmJpbmRQb3B1cChwb3B1cF8xMDY4ZmU3ZmI4NWE0ZGM1YjRhZWNmNTM5NWQzYmJiMikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl85ZTM3ZTg5ZDM5OGE0YTdhYjNmMjIwN2MzNmU2ZTliMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM4LjQwMzQ0MTAwODc4NjAyLCAtOS43MDA1ODgwMTA5MjA5NzJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfOTEwZDA0OGEwNjUzNDU0MzkyNGE5NGIyNTBlYzYyZGMgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzVhZDE1YmMwNWIxMTRkMzQ4ODEwODFiMDIwODI1ODE3ID0gJChgPGRpdiBpZD0iaHRtbF81YWQxNWJjMDViMTE0ZDM0ODgxMDgxYjAyMDgyNTgxNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ODQ8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfOTEwZDA0OGEwNjUzNDU0MzkyNGE5NGIyNTBlYzYyZGMuc2V0Q29udGVudChodG1sXzVhZDE1YmMwNWIxMTRkMzQ4ODEwODFiMDIwODI1ODE3KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzllMzdlODlkMzk4YTRhN2FiM2YyMjA3YzM2ZTZlOWIxLmJpbmRQb3B1cChwb3B1cF85MTBkMDQ4YTA2NTM0NTQzOTI0YTk0YjI1MGVjNjJkYykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8yODgzMjUzYzdkMzM0YjdjOWFhNzg2Yjg5NjhjYTFhYiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ4LjI1NTA4MTk2NzY4ODU3LCAxNy4wOTk5NjcxODI0MDE2NF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzk2NDgwZmE1ZTJiYjRiNDk5Yzg0NzIyODNmYzMxOWE5KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF84Y2QwOTViMThiNzE0ZDQ4YWE4YTlhMzVlNzA5YTQyMSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfZDgyMzI4NTdlNGY3NDFhZWE5MDEzYjI4NTA1Y2RkMDQgPSAkKGA8ZGl2IGlkPSJodG1sX2Q4MjMyODU3ZTRmNzQxYWVhOTAxM2IyODUwNWNkZDA0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij44NTwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF84Y2QwOTViMThiNzE0ZDQ4YWE4YTlhMzVlNzA5YTQyMS5zZXRDb250ZW50KGh0bWxfZDgyMzI4NTdlNGY3NDFhZWE5MDEzYjI4NTA1Y2RkMDQpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMjg4MzI1M2M3ZDMzNGI3YzlhYTc4NmI4OTY4Y2ExYWIuYmluZFBvcHVwKHBvcHVwXzhjZDA5NWIxOGI3MTRkNDhhYThhOWEzNWU3MDlhNDIxKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzJlYTQzYjJiZTEzMzQyOWU5ZmQxOTAxNDY0MDM2MWQyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTQuMDg2NjkyNjQ4NzU1OTIsIC0yLjc4Mjk1OTU2NzExMDE4OF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzk2NDgwZmE1ZTJiYjRiNDk5Yzg0NzIyODNmYzMxOWE5KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9jMmIyNTRiYWI1MjY0MzEzYjIyYTRhMDkyOGYyMTBjNyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfZGViMWFiNGU3OTI2NGNiMGI3OWZiOTliNjk3MmIyYjQgPSAkKGA8ZGl2IGlkPSJodG1sX2RlYjFhYjRlNzkyNjRjYjBiNzlmYjk5YjY5NzJiMmI0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij44NjwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9jMmIyNTRiYWI1MjY0MzEzYjIyYTRhMDkyOGYyMTBjNy5zZXRDb250ZW50KGh0bWxfZGViMWFiNGU3OTI2NGNiMGI3OWZiOTliNjk3MmIyYjQpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMmVhNDNiMmJlMTMzNDI5ZTlmZDE5MDE0NjQwMzYxZDIuYmluZFBvcHVwKHBvcHVwX2MyYjI1NGJhYjUyNjQzMTNiMjJhNGEwOTI4ZjIxMGM3KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzMxY2NiNWU4M2RhODQwNTU5ZTg5ODRjMjlmYTY3MTAxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuMjI1MzI4OTA4MDIzNDg1LCAwLjg2ODIxNzA1MjY5NDI0ODVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYmNlZjIzNGJjMGMzNDI5NWEwNjZjNDM1MDMxNjVjNWEgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2U3ODk0N2Q2Y2QzNDQ1OGM4ZDgzYWQ4MjFjNGJiNmY0ID0gJChgPGRpdiBpZD0iaHRtbF9lNzg5NDdkNmNkMzQ0NThjOGQ4M2FkODIxYzRiYjZmNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ODc8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYmNlZjIzNGJjMGMzNDI5NWEwNjZjNDM1MDMxNjVjNWEuc2V0Q29udGVudChodG1sX2U3ODk0N2Q2Y2QzNDQ1OGM4ZDgzYWQ4MjFjNGJiNmY0KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzMxY2NiNWU4M2RhODQwNTU5ZTg5ODRjMjlmYTY3MTAxLmJpbmRQb3B1cChwb3B1cF9iY2VmMjM0YmMwYzM0Mjk1YTA2NmM0MzUwMzE2NWM1YSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9kZWM4MmEwNzE5ODE0ZjU5YWJiNjI5MWQxNWVkZmVlZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM4LjY3NjU5NzY5NDA1NDM2NSwgNi44OTU1MDQ3MjM3MzIwODVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZjZkZGNmMjFiMjc2NDY1MDk1NzJlNzhkZWM3YmY0YjYgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2NlZjc3NDRhNzBlMTRmNjRiOGRlYTM0NDU0NmQwZDFkID0gJChgPGRpdiBpZD0iaHRtbF9jZWY3NzQ0YTcwZTE0ZjY0YjhkZWEzNDQ1NDZkMGQxZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ODg8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZjZkZGNmMjFiMjc2NDY1MDk1NzJlNzhkZWM3YmY0YjYuc2V0Q29udGVudChodG1sX2NlZjc3NDRhNzBlMTRmNjRiOGRlYTM0NDU0NmQwZDFkKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2RlYzgyYTA3MTk4MTRmNTlhYmI2MjkxZDE1ZWRmZWVlLmJpbmRQb3B1cChwb3B1cF9mNmRkY2YyMWIyNzY0NjUwOTU3MmU3OGRlYzdiZjRiNikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8xODdjMDJkZTNkNmU0ZTA1ODdiZjlmY2RlMWZiYmQyZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM4Ljk4MjEwMTQ1MDg3NzMyLCA2Ljg2MDcxNDg2NDQ3ODE5N10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzk2NDgwZmE1ZTJiYjRiNDk5Yzg0NzIyODNmYzMxOWE5KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF81OGM4NzQ2MGI0NTg0ODgwOWE4ZGFjYmQ5NzQ2YzllZCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfZWNlMTA5ZDlmNTY4NGU3MmE0YjJjZjc1YWU1MmI3NGYgPSAkKGA8ZGl2IGlkPSJodG1sX2VjZTEwOWQ5ZjU2ODRlNzJhNGIyY2Y3NWFlNTJiNzRmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij44OTwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF81OGM4NzQ2MGI0NTg0ODgwOWE4ZGFjYmQ5NzQ2YzllZC5zZXRDb250ZW50KGh0bWxfZWNlMTA5ZDlmNTY4NGU3MmE0YjJjZjc1YWU1MmI3NGYpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMTg3YzAyZGUzZDZlNGUwNTg3YmY5ZmNkZTFmYmJkMmYuYmluZFBvcHVwKHBvcHVwXzU4Yzg3NDYwYjQ1ODQ4ODA5YThkYWNiZDk3NDZjOWVkKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzJkNzEyOWQ4OWUzMDQxMDliN2M3OTdmNTlkYTYwODQ3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTcuODAwODg4NDA5NTI4NzYsIDIyLjgxMjIzNjUzNTk2NDk2M10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzk2NDgwZmE1ZTJiYjRiNDk5Yzg0NzIyODNmYzMxOWE5KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9mYjZiNjViNWZkNDA0NTBhYjE4OWQxYWUzMDQzZWRjNyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfM2ZhZWQxZWM0YWIwNDBkZDhiMDVkNzdmMGZhODE4ODAgPSAkKGA8ZGl2IGlkPSJodG1sXzNmYWVkMWVjNGFiMDQwZGQ4YjA1ZDc3ZjBmYTgxODgwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij45MDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9mYjZiNjViNWZkNDA0NTBhYjE4OWQxYWUzMDQzZWRjNy5zZXRDb250ZW50KGh0bWxfM2ZhZWQxZWM0YWIwNDBkZDhiMDVkNzdmMGZhODE4ODApOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMmQ3MTI5ZDg5ZTMwNDEwOWI3Yzc5N2Y1OWRhNjA4NDcuYmluZFBvcHVwKHBvcHVwX2ZiNmI2NWI1ZmQ0MDQ1MGFiMTg5ZDFhZTMwNDNlZGM3KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzc4MzkyODA2MmFiYTQ5NTRiMTJkYzA3YTc2YzNhOTE2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDUuNjY3MTY1Mzc3ODgzMjcsIDAuMTE0MjkyNzA0NzUxNDc1NjhdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMzZiNDk4YzlhNWQ5NDczMmFiYTViMjA0YjRjYzk5MGUgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2RkZjEyNzcxNDhkNTQ3ZWRhMGY5YzM0YWQ0YzliYzUyID0gJChgPGRpdiBpZD0iaHRtbF9kZGYxMjc3MTQ4ZDU0N2VkYTBmOWMzNGFkNGM5YmM1MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+OTE8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMzZiNDk4YzlhNWQ5NDczMmFiYTViMjA0YjRjYzk5MGUuc2V0Q29udGVudChodG1sX2RkZjEyNzcxNDhkNTQ3ZWRhMGY5YzM0YWQ0YzliYzUyKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzc4MzkyODA2MmFiYTQ5NTRiMTJkYzA3YTc2YzNhOTE2LmJpbmRQb3B1cChwb3B1cF8zNmI0OThjOWE1ZDk0NzMyYWJhNWIyMDRiNGNjOTkwZSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl82ZTZhYjVmODU4OWU0Y2ZjOGE3ZjlkNTc1OWE1NDczNiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ4LjIyODY0OTI3NTE3NzU2LCA1LjUwOTEyMzM0ODE1MjQ3MV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzk2NDgwZmE1ZTJiYjRiNDk5Yzg0NzIyODNmYzMxOWE5KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF81MDFmN2JhZGE0ZTA0ZmQzYTVmN2Y0ZmU3MGEwMjgyYiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfNDdmM2JmYzg3NTRmNGNkOGI4NDZkNTZjMmU3ZDA1NTAgPSAkKGA8ZGl2IGlkPSJodG1sXzQ3ZjNiZmM4NzU0ZjRjZDhiODQ2ZDU2YzJlN2QwNTUwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij45MjwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF81MDFmN2JhZGE0ZTA0ZmQzYTVmN2Y0ZmU3MGEwMjgyYi5zZXRDb250ZW50KGh0bWxfNDdmM2JmYzg3NTRmNGNkOGI4NDZkNTZjMmU3ZDA1NTApOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNmU2YWI1Zjg1ODllNGNmYzhhN2Y5ZDU3NTlhNTQ3MzYuYmluZFBvcHVwKHBvcHVwXzUwMWY3YmFkYTRlMDRmZDNhNWY3ZjRmZTcwYTAyODJiKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzc0ZTg5NDVjOWFjMTQ4Nzc5ZTJiNTI3NzEwOWM5YjM2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTcuNjY1NjE2ODg1ODEzNzA1LCAxOC4zMDEzMDc2MTUyOTc3NzddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYzA5ODJlMDM3ZDk5NDhmMDg3YmRiNGVlZDk1Mzg5ODIgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2Y0MTg2NmI3MjIwOTRmMGE5MTQ3MmVlMGE3OTM3Mjk4ID0gJChgPGRpdiBpZD0iaHRtbF9mNDE4NjZiNzIyMDk0ZjBhOTE0NzJlZTBhNzkzNzI5OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+OTM8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYzA5ODJlMDM3ZDk5NDhmMDg3YmRiNGVlZDk1Mzg5ODIuc2V0Q29udGVudChodG1sX2Y0MTg2NmI3MjIwOTRmMGE5MTQ3MmVlMGE3OTM3Mjk4KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzc0ZTg5NDVjOWFjMTQ4Nzc5ZTJiNTI3NzEwOWM5YjM2LmJpbmRQb3B1cChwb3B1cF9jMDk4MmUwMzdkOTk0OGYwODdiZGI0ZWVkOTUzODk4MikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl80MmMyYmU5NzY3Y2I0ZGQ3OWU3ZjQzMDIyMDU3MmUyMCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQyLjYwNzA0NTA3Mjk5Mjk3NSwgLTQuNTUyOTM5MTg3NzQ4MDg3XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFya2VyX2NsdXN0ZXJfOTY0ODBmYTVlMmJiNGI0OTljODQ3MjI4M2ZjMzE5YTkpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2EyNDE2NjVlMTUwNjQ2MDA5OTJjM2Q0ZjNkODExZWQwID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9mYTBjZGUxYzIxM2I0MmM1YjMxNDU4ZTliMWU2ZWNkZiA9ICQoYDxkaXYgaWQ9Imh0bWxfZmEwY2RlMWMyMTNiNDJjNWIzMTQ1OGU5YjFlNmVjZGYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjk0PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2EyNDE2NjVlMTUwNjQ2MDA5OTJjM2Q0ZjNkODExZWQwLnNldENvbnRlbnQoaHRtbF9mYTBjZGUxYzIxM2I0MmM1YjMxNDU4ZTliMWU2ZWNkZik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl80MmMyYmU5NzY3Y2I0ZGQ3OWU3ZjQzMDIyMDU3MmUyMC5iaW5kUG9wdXAocG9wdXBfYTI0MTY2NWUxNTA2NDYwMDk5MmMzZDRmM2Q4MTFlZDApCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfN2I2YjJhZDMxMGQ1NDI3MGIyMmY5NGE2ZjY2YmNlNDggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OC43NzUxNzM2MDQ0ODQzMiwgLTExLjM3MTY2MjE1ODE2MDM0OF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzk2NDgwZmE1ZTJiYjRiNDk5Yzg0NzIyODNmYzMxOWE5KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8zN2NjYmY0NjJjMWE0NmEwYWMyZmEzMWMzZTI5MGMwMCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfN2JjZGQwYWI1OWNkNDM0YTg5ZDQyMjYyNTc1OTZkNGQgPSAkKGA8ZGl2IGlkPSJodG1sXzdiY2RkMGFiNTljZDQzNGE4OWQ0MjI2MjU3NTk2ZDRkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij45NTwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8zN2NjYmY0NjJjMWE0NmEwYWMyZmEzMWMzZTI5MGMwMC5zZXRDb250ZW50KGh0bWxfN2JjZGQwYWI1OWNkNDM0YTg5ZDQyMjYyNTc1OTZkNGQpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfN2I2YjJhZDMxMGQ1NDI3MGIyMmY5NGE2ZjY2YmNlNDguYmluZFBvcHVwKHBvcHVwXzM3Y2NiZjQ2MmMxYTQ2YTBhYzJmYTMxYzNlMjkwYzAwKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzg2YThhMWIxZTg3ODQxZWY4Y2RkOGU1MzA4ZjY5YjY1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDYuNDQ5MTAzMzcyMTA0NTMsIC00LjE3NjQ2NzY4ODU2MTEzNF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzk2NDgwZmE1ZTJiYjRiNDk5Yzg0NzIyODNmYzMxOWE5KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF85OTI2MGZlMTE4MTI0ZjcyOTg4OGY0ZjYyYWIxODY4OCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfYjdiNzQwNzZlMDAxNGM4Y2FhNDlmZWIwNDg3MzEyZjggPSAkKGA8ZGl2IGlkPSJodG1sX2I3Yjc0MDc2ZTAwMTRjOGNhYTQ5ZmViMDQ4NzMxMmY4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij45NjwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF85OTI2MGZlMTE4MTI0ZjcyOTg4OGY0ZjYyYWIxODY4OC5zZXRDb250ZW50KGh0bWxfYjdiNzQwNzZlMDAxNGM4Y2FhNDlmZWIwNDg3MzEyZjgpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfODZhOGExYjFlODc4NDFlZjhjZGQ4ZTUzMDhmNjliNjUuYmluZFBvcHVwKHBvcHVwXzk5MjYwZmUxMTgxMjRmNzI5ODg4ZjRmNjJhYjE4Njg4KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzFjOWQ5MjY0ZDJlMTQ1NjI5ZjYzNzZkMjhiN2U3NzMzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzkuODI1MDU2OTkyODk5NzIsIDE2LjA2MzcyMzM4NzgwOTcxNl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzk2NDgwZmE1ZTJiYjRiNDk5Yzg0NzIyODNmYzMxOWE5KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8zODg1ZWM1OTBlYjM0Nzg3OGM3ZGM2YzZkYjQ5NzI2YiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfNDExNjYzOGJiODljNGEwODljZDRjYmY5N2ZhNTEwMmYgPSAkKGA8ZGl2IGlkPSJodG1sXzQxMTY2MzhiYjg5YzRhMDg5Y2Q0Y2JmOTdmYTUxMDJmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij45NzwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8zODg1ZWM1OTBlYjM0Nzg3OGM3ZGM2YzZkYjQ5NzI2Yi5zZXRDb250ZW50KGh0bWxfNDExNjYzOGJiODljNGEwODljZDRjYmY5N2ZhNTEwMmYpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMWM5ZDkyNjRkMmUxNDU2MjlmNjM3NmQyOGI3ZTc3MzMuYmluZFBvcHVwKHBvcHVwXzM4ODVlYzU5MGViMzQ3ODc4YzdkYzZjNmRiNDk3MjZiKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzZjYzY2YWZlNDYwMjQ3NTViOTBkYTdlMTk3YjE0Mjg3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTE3ODU4MjU1NTE0NzksIC0xMS44Nzk2MTY0NTk1NDI2MjhdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfOTAyODg2ZjM1N2FlNDRiNWE2ZTdkMzZlMGFlM2E3YjEgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzVkYjcyNzhiNzU4OTQ0ODQ5MjJhOWFkMDM5ODhmZDdkID0gJChgPGRpdiBpZD0iaHRtbF81ZGI3Mjc4Yjc1ODk0NDg0OTIyYTlhZDAzOTg4ZmQ3ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+OTg8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfOTAyODg2ZjM1N2FlNDRiNWE2ZTdkMzZlMGFlM2E3YjEuc2V0Q29udGVudChodG1sXzVkYjcyNzhiNzU4OTQ0ODQ5MjJhOWFkMDM5ODhmZDdkKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzZjYzY2YWZlNDYwMjQ3NTViOTBkYTdlMTk3YjE0Mjg3LmJpbmRQb3B1cChwb3B1cF85MDI4ODZmMzU3YWU0NGI1YTZlN2QzNmUwYWUzYTdiMSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9kZDkzMmJmZGNiYzQ0MGVjYTBmNjQ5MmFiM2RkN2M2NSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQxLjg3OTEzODQ0Njg1ODQ1LCAtOC4xNzY3MTQ4MTA5NjIyMzhdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXJrZXJfY2x1c3Rlcl85NjQ4MGZhNWUyYmI0YjQ5OWM4NDcyMjgzZmMzMTlhOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYWViN2YwNTk3ZWQzNDdlMmE2MjFkODk5ZTI0ODkxMWIgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzk2MDdmODQyZjAyODQ2N2JhN2FjMTVlMmZiMTFmZGYyID0gJChgPGRpdiBpZD0iaHRtbF85NjA3Zjg0MmYwMjg0NjdiYTdhYzE1ZTJmYjExZmRmMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+OTk8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYWViN2YwNTk3ZWQzNDdlMmE2MjFkODk5ZTI0ODkxMWIuc2V0Q29udGVudChodG1sXzk2MDdmODQyZjAyODQ2N2JhN2FjMTVlMmZiMTFmZGYyKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2RkOTMyYmZkY2JjNDQwZWNhMGY2NDkyYWIzZGQ3YzY1LmJpbmRQb3B1cChwb3B1cF9hZWI3ZjA1OTdlZDM0N2UyYTYyMWQ4OTllMjQ4OTExYikKICAgICAgICA7CgogICAgICAgIAogICAgCjwvc2NyaXB0Pg==\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
      ],
      "text/plain": [
       "<folium.folium.Map at 0x7f819c62fe10>"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "N = 100\n",
    "data = np.array(\n",
    "    [\n",
    "        np.random.uniform(low=35, high=60, size=N),  # Random latitudes in Europe.\n",
    "        np.random.uniform(low=-12, high=30, size=N),  # Random longitudes in Europe.\n",
    "    ]\n",
    ").T\n",
    "popups = [str(i) for i in range(N)] # Popups texts are simple numbers.\n",
    "\n",
    "m = folium.Map([45, 3], zoom_start=4)\n",
    "\n",
    "plugins.MarkerCluster(data, popups=popups).add_to(m)\n",
    "\n",
    "m.save(os.path.join('results', 'Plugins_1.html'))\n",
    "m"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Terminator"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgCiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgTF9OT19UT1VDSCA9IGZhbHNlOwogICAgICAgICAgICBMX0RJU0FCTEVfM0QgPSBmYWxzZTsKICAgICAgICA8L3NjcmlwdD4KICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjEyLjQubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2Nzcy9ib290c3RyYXAubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9mb250LWF3ZXNvbWUvNC42LjMvY3NzL2ZvbnQtYXdlc29tZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC4yL2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9weXRob24tdmlzdWFsaXphdGlvbi9mb2xpdW0vbWFzdGVyL2ZvbGl1bS90ZW1wbGF0ZXMvbGVhZmxldC5hd2Vzb21lLnJvdGF0ZS5jc3MiLz4KICAgIDxzdHlsZT5odG1sLCBib2R5IHt3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7bWFyZ2luOiAwO3BhZGRpbmc6IDA7fTwvc3R5bGU+CiAgICA8c3R5bGU+I21hcCB7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7cmlnaHQ6MDtsZWZ0OjA7fTwvc3R5bGU+CiAgICAKICAgICAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwKICAgICAgICAgICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgICAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAgICAgI21hcF83NmMwZmNjOTA1YmM0ODQ2ODEzZDVlZGIzYjg3ZTNhNSB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgbGVmdDogMC4wJTsKICAgICAgICAgICAgICAgICAgICB0b3A6IDAuMCU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIDwvc3R5bGU+CiAgICAgICAgCiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly91bnBrZy5jb20vQGpvZXJnZGlldHJpY2gvbGVhZmxldC50ZXJtaW5hdG9yIj48L3NjcmlwdD4KPC9oZWFkPgo8Ym9keT4gICAgCiAgICAKICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9saXVtLW1hcCIgaWQ9Im1hcF83NmMwZmNjOTA1YmM0ODQ2ODEzZDVlZGIzYjg3ZTNhNSIgPjwvZGl2PgogICAgICAgIAo8L2JvZHk+CjxzY3JpcHQ+ICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXBfNzZjMGZjYzkwNWJjNDg0NjgxM2Q1ZWRiM2I4N2UzYTUgPSBMLm1hcCgKICAgICAgICAgICAgICAgICJtYXBfNzZjMGZjYzkwNWJjNDg0NjgxM2Q1ZWRiM2I4N2UzYTUiLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNlbnRlcjogWzQ1LjAsIDMuMF0sCiAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NywKICAgICAgICAgICAgICAgICAgICB6b29tOiAxLAogICAgICAgICAgICAgICAgICAgIHpvb21Db250cm9sOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHByZWZlckNhbnZhczogZmFsc2UsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICAKCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfZGJmMjZkOWFkOTY4NDEwMWFjMzkzMDJkNjRkZDk2YWMgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICJodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZyIsCiAgICAgICAgICAgICAgICB7ImF0dHJpYnV0aW9uIjogIkRhdGEgYnkgXHUwMDI2Y29weTsgXHUwMDNjYSBocmVmPVwiaHR0cDovL29wZW5zdHJlZXRtYXAub3JnXCJcdTAwM2VPcGVuU3RyZWV0TWFwXHUwMDNjL2FcdTAwM2UsIHVuZGVyIFx1MDAzY2EgaHJlZj1cImh0dHA6Ly93d3cub3BlbnN0cmVldG1hcC5vcmcvY29weXJpZ2h0XCJcdTAwM2VPRGJMXHUwMDNjL2FcdTAwM2UuIiwgImRldGVjdFJldGluYSI6IGZhbHNlLCAibWF4TmF0aXZlWm9vbSI6IDE4LCAibWF4Wm9vbSI6IDE4LCAibWluWm9vbSI6IDAsICJub1dyYXAiOiBmYWxzZSwgIm9wYWNpdHkiOiAxLCAic3ViZG9tYWlucyI6ICJhYmMiLCAidG1zIjogZmFsc2V9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzc2YzBmY2M5MDViYzQ4NDY4MTNkNWVkYjNiODdlM2E1KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBMLnRlcm1pbmF0b3IoKS5hZGRUbyhtYXBfNzZjMGZjYzkwNWJjNDg0NjgxM2Q1ZWRiM2I4N2UzYTUpOwogICAgICAgIAo8L3NjcmlwdD4=\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
      ],
      "text/plain": [
       "<folium.folium.Map at 0x7f819c62f908>"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m = folium.Map([45, 3], zoom_start=1)\n",
    "\n",
    "plugins.Terminator().add_to(m)\n",
    "\n",
    "m.save(os.path.join('results', 'Plugins_2.html'))\n",
    "m"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##  BoatMarker"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgCiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgTF9OT19UT1VDSCA9IGZhbHNlOwogICAgICAgICAgICBMX0RJU0FCTEVfM0QgPSBmYWxzZTsKICAgICAgICA8L3NjcmlwdD4KICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjEyLjQubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2Nzcy9ib290c3RyYXAubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9mb250LWF3ZXNvbWUvNC42LjMvY3NzL2ZvbnQtYXdlc29tZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC4yL2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9weXRob24tdmlzdWFsaXphdGlvbi9mb2xpdW0vbWFzdGVyL2ZvbGl1bS90ZW1wbGF0ZXMvbGVhZmxldC5hd2Vzb21lLnJvdGF0ZS5jc3MiLz4KICAgIDxzdHlsZT5odG1sLCBib2R5IHt3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7bWFyZ2luOiAwO3BhZGRpbmc6IDA7fTwvc3R5bGU+CiAgICA8c3R5bGU+I21hcCB7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7cmlnaHQ6MDtsZWZ0OjA7fTwvc3R5bGU+CiAgICAKICAgICAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwKICAgICAgICAgICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgICAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAgICAgI21hcF8yOGZmMmIxODc4NjU0ZjZjYWU4NDZkYjMyM2JhODdlMSB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgbGVmdDogMC4wJTsKICAgICAgICAgICAgICAgICAgICB0b3A6IDAuMCU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIDwvc3R5bGU+CiAgICAgICAgCiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly91bnBrZy5jb20vbGVhZmxldC5ib2F0bWFya2VyL2xlYWZsZXQuYm9hdG1hcmtlci5taW4uanMiPjwvc2NyaXB0Pgo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzI4ZmYyYjE4Nzg2NTRmNmNhZTg0NmRiMzIzYmE4N2UxIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcF8yOGZmMmIxODc4NjU0ZjZjYWU4NDZkYjMyM2JhODdlMSA9IEwubWFwKAogICAgICAgICAgICAgICAgIm1hcF8yOGZmMmIxODc4NjU0ZjZjYWU4NDZkYjMyM2JhODdlMSIsCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2VudGVyOiBbMzAuMCwgMC4wXSwKICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3LAogICAgICAgICAgICAgICAgICAgIHpvb206IDMsCiAgICAgICAgICAgICAgICAgICAgem9vbUNvbnRyb2w6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgcHJlZmVyQ2FudmFzOiBmYWxzZSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIAoKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl8zNjJhYzVmNzMzZjU0NmU5OGRhNzE1ZTllNjJjOTQ2ZSA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgImh0dHBzOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nIiwKICAgICAgICAgICAgICAgIHsiYXR0cmlidXRpb24iOiAiRGF0YSBieSBcdTAwMjZjb3B5OyBcdTAwM2NhIGhyZWY9XCJodHRwOi8vb3BlbnN0cmVldG1hcC5vcmdcIlx1MDAzZU9wZW5TdHJlZXRNYXBcdTAwM2MvYVx1MDAzZSwgdW5kZXIgXHUwMDNjYSBocmVmPVwiaHR0cDovL3d3dy5vcGVuc3RyZWV0bWFwLm9yZy9jb3B5cmlnaHRcIlx1MDAzZU9EYkxcdTAwM2MvYVx1MDAzZS4iLCAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsICJtYXhOYXRpdmVab29tIjogMTgsICJtYXhab29tIjogMTgsICJtaW5ab29tIjogMCwgIm5vV3JhcCI6IGZhbHNlLCAib3BhY2l0eSI6IDEsICJzdWJkb21haW5zIjogImFiYyIsICJ0bXMiOiBmYWxzZX0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjhmZjJiMTg3ODY1NGY2Y2FlODQ2ZGIzMjNiYTg3ZTEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBib2F0X21hcmtlcl85YjQzZGM2Y2E0MDc0M2FkYjdmYTI5MjdkODA3ZjZmMCA9IEwuYm9hdE1hcmtlcigKICAgICAgICAgICAgICAgIFszNC4wLCAtNDMuMF0sCiAgICAgICAgICAgICAgICB7ImNvbG9yIjogIiM4ZjgifQogICAgICAgICAgICApLmFkZFRvKG1hcF8yOGZmMmIxODc4NjU0ZjZjYWU4NDZkYjMyM2JhODdlMSk7CiAgICAgICAgICAgIGJvYXRfbWFya2VyXzliNDNkYzZjYTQwNzQzYWRiN2ZhMjkyN2Q4MDdmNmYwLnNldEhlYWRpbmdXaW5kKAogICAgICAgICAgICAgICAgNDUsCiAgICAgICAgICAgICAgICA0NSwKICAgICAgICAgICAgICAgIDE1MAogICAgICAgICAgICApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgYm9hdF9tYXJrZXJfYWFmZDhhNjcxNmM1NDk5ODkzMmQyMWIwNjI4NThlNmYgPSBMLmJvYXRNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDYuMCwgLTMwLjBdLAogICAgICAgICAgICAgICAgeyJjb2xvciI6ICIjODhmIn0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjhmZjJiMTg3ODY1NGY2Y2FlODQ2ZGIzMjNiYTg3ZTEpOwogICAgICAgICAgICBib2F0X21hcmtlcl9hYWZkOGE2NzE2YzU0OTk4OTMyZDIxYjA2Mjg1OGU2Zi5zZXRIZWFkaW5nV2luZCgKICAgICAgICAgICAgICAgIC0yMCwKICAgICAgICAgICAgICAgIDI1LAogICAgICAgICAgICAgICAgNDYKICAgICAgICAgICAgKTsKICAgICAgICAgICAgCjwvc2NyaXB0Pg==\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
      ],
      "text/plain": [
       "<folium.folium.Map at 0x7f819c4a88d0>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m = folium.Map([30, 0], zoom_start=3)\n",
    "\n",
    "plugins.BoatMarker(\n",
    "    location=(34, -43),\n",
    "    heading=45,\n",
    "    wind_heading=150,\n",
    "    wind_speed=45,\n",
    "    color='#8f8'\n",
    ").add_to(m)\n",
    "\n",
    "plugins.BoatMarker(\n",
    "    location=(46, -30),\n",
    "    heading=-20,\n",
    "    wind_heading=46,\n",
    "    wind_speed=25,\n",
    "    color='#88f'\n",
    ").add_to(m)\n",
    "\n",
    "m.save(os.path.join('results', 'Plugins_3.html'))\n",
    "m"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## BeautifyIcon"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgCiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgTF9OT19UT1VDSCA9IGZhbHNlOwogICAgICAgICAgICBMX0RJU0FCTEVfM0QgPSBmYWxzZTsKICAgICAgICA8L3NjcmlwdD4KICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjEyLjQubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2Nzcy9ib290c3RyYXAubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9mb250LWF3ZXNvbWUvNC42LjMvY3NzL2ZvbnQtYXdlc29tZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC4yL2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9weXRob24tdmlzdWFsaXphdGlvbi9mb2xpdW0vbWFzdGVyL2ZvbGl1bS90ZW1wbGF0ZXMvbGVhZmxldC5hd2Vzb21lLnJvdGF0ZS5jc3MiLz4KICAgIDxzdHlsZT5odG1sLCBib2R5IHt3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7bWFyZ2luOiAwO3BhZGRpbmc6IDA7fTwvc3R5bGU+CiAgICA8c3R5bGU+I21hcCB7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7cmlnaHQ6MDtsZWZ0OjA7fTwvc3R5bGU+CiAgICAKICAgICAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwKICAgICAgICAgICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgICAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAgICAgI21hcF9kMzg1ZTk3ODNlODA0ZWQxYTRlZGQ5YTkyZTdkZGY5OSB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgbGVmdDogMC4wJTsKICAgICAgICAgICAgICAgICAgICB0b3A6IDAuMCU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIDwvc3R5bGU+CiAgICAgICAgCiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vcmF3Y2RuLmdpdGhhY2suY29tL21hcnNsYW4zOTAvQmVhdXRpZnlNYXJrZXIvbWFzdGVyL2xlYWZsZXQtYmVhdXRpZnktbWFya2VyLWljb24uY3NzIi8+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9yYXdjZG4uZ2l0aGFjay5jb20vbWFyc2xhbjM5MC9CZWF1dGlmeU1hcmtlci9tYXN0ZXIvbGVhZmxldC1iZWF1dGlmeS1tYXJrZXItaWNvbi5qcyI+PC9zY3JpcHQ+CjwvaGVhZD4KPGJvZHk+ICAgIAogICAgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvbGl1bS1tYXAiIGlkPSJtYXBfZDM4NWU5NzgzZTgwNGVkMWE0ZWRkOWE5MmU3ZGRmOTkiID48L2Rpdj4KICAgICAgICAKPC9ib2R5Pgo8c2NyaXB0PiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFwX2QzODVlOTc4M2U4MDRlZDFhNGVkZDlhOTJlN2RkZjk5ID0gTC5tYXAoCiAgICAgICAgICAgICAgICAibWFwX2QzODVlOTc4M2U4MDRlZDFhNGVkZDlhOTJlN2RkZjk5IiwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjZW50ZXI6IFs0NS41LCAtMTIyLjBdLAogICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcsCiAgICAgICAgICAgICAgICAgICAgem9vbTogMywKICAgICAgICAgICAgICAgICAgICB6b29tQ29udHJvbDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBwcmVmZXJDYW52YXM6IGZhbHNlLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwoKICAgICAgICAgICAgCgogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyXzJmYWU0YzY5OGZhNjRiMWU5YTgyYzEwOGNkYTdhNTYzID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAiaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmciLAogICAgICAgICAgICAgICAgeyJhdHRyaWJ1dGlvbiI6ICJEYXRhIGJ5IFx1MDAyNmNvcHk7IFx1MDAzY2EgaHJlZj1cImh0dHA6Ly9vcGVuc3RyZWV0bWFwLm9yZ1wiXHUwMDNlT3BlblN0cmVldE1hcFx1MDAzYy9hXHUwMDNlLCB1bmRlciBcdTAwM2NhIGhyZWY9XCJodHRwOi8vd3d3Lm9wZW5zdHJlZXRtYXAub3JnL2NvcHlyaWdodFwiXHUwMDNlT0RiTFx1MDAzYy9hXHUwMDNlLiIsICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwgIm1heE5hdGl2ZVpvb20iOiAxOCwgIm1heFpvb20iOiAxOCwgIm1pblpvb20iOiAwLCAibm9XcmFwIjogZmFsc2UsICJvcGFjaXR5IjogMSwgInN1YmRvbWFpbnMiOiAiYWJjIiwgInRtcyI6IGZhbHNlfQogICAgICAgICAgICApLmFkZFRvKG1hcF9kMzg1ZTk3ODNlODA0ZWQxYTRlZGQ5YTkyZTdkZGY5OSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9mODE4ZDdlYzhmMjI0OTAyYWQ0OTNiYjE3Y2FlMWMxYiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ2LjAsIC0xMjIuMF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9kMzg1ZTk3ODNlODA0ZWQxYTRlZGQ5YTkyZTdkZGY5OSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGJlYXV0aWZ5X2ljb25fOGQzNzAzMGI2NTUyNDc1NDkzNWEzYjdhOWI0MzA0OWIgPSBuZXcgTC5CZWF1dGlmeUljb24uaWNvbigKICAgICAgICAgICAgICAgIHsiYmFja2dyb3VuZENvbG9yIjogIiNGRkYiLCAiYm9yZGVyQ29sb3IiOiAiI2IzMzM0ZiIsICJib3JkZXJXaWR0aCI6IDMsICJpY29uIjogInBsYW5lIiwgImljb25TaGFwZSI6ICJ0cmlhbmdsZSIsICJpbm5lckljb25TdHlsZSI6ICIiLCAiaXNBbHBoYU51bWVyaWNJY29uIjogZmFsc2UsICJzcGluIjogZmFsc2UsICJ0ZXh0Q29sb3IiOiAiI2IzMzM0ZiJ9CiAgICAgICAgICAgICkKICAgICAgICAgICAgbWFya2VyX2Y4MThkN2VjOGYyMjQ5MDJhZDQ5M2JiMTdjYWUxYzFiLnNldEljb24oYmVhdXRpZnlfaWNvbl84ZDM3MDMwYjY1NTI0NzU0OTM1YTNiN2E5YjQzMDQ5Yik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfOTk0N2JiZmRlYmEwNDRjNGIwYTVmOTBhMGFkNzk3ZDEgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzY1M2JiMjRhNTI3MTQ2ZmQ4ZGFlMWU1NWNkMGI3NDIzID0gJChgPGRpdiBpZD0iaHRtbF82NTNiYjI0YTUyNzE0NmZkOGRhZTFlNTVjZDBiNzQyMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UG9ydGxhbmQsIE9SPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzk5NDdiYmZkZWJhMDQ0YzRiMGE1ZjkwYTBhZDc5N2QxLnNldENvbnRlbnQoaHRtbF82NTNiYjI0YTUyNzE0NmZkOGRhZTFlNTVjZDBiNzQyMyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9mODE4ZDdlYzhmMjI0OTAyYWQ0OTNiYjE3Y2FlMWMxYi5iaW5kUG9wdXAocG9wdXBfOTk0N2JiZmRlYmEwNDRjNGIwYTVmOTBhMGFkNzk3ZDEpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTdhYzc3YjFhMWM4NGIzZDhlYWQ0ODY3OWE1NWVmNTIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MC4wLCAtMTIyLjBdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfZDM4NWU5NzgzZTgwNGVkMWE0ZWRkOWE5MmU3ZGRmOTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBiZWF1dGlmeV9pY29uX2VmMTI5MTFjY2VhZDRmYmRiOWMyMGVkOGE0ZDk1ZDBiID0gbmV3IEwuQmVhdXRpZnlJY29uLmljb24oCiAgICAgICAgICAgICAgICB7ImJhY2tncm91bmRDb2xvciI6ICIjRkZGIiwgImJvcmRlckNvbG9yIjogIiMwMEFCREMiLCAiYm9yZGVyV2lkdGgiOiAzLCAiaW5uZXJJY29uU3R5bGUiOiAibWFyZ2luLXRvcDowOyIsICJpc0FscGhhTnVtZXJpY0ljb24iOiB0cnVlLCAic3BpbiI6IGZhbHNlLCAidGV4dCI6IDEwLCAidGV4dENvbG9yIjogIiMwMEFCREMifQogICAgICAgICAgICApCiAgICAgICAgICAgIG1hcmtlcl81N2FjNzdiMWExYzg0YjNkOGVhZDQ4Njc5YTU1ZWY1Mi5zZXRJY29uKGJlYXV0aWZ5X2ljb25fZWYxMjkxMWNjZWFkNGZiZGI5YzIwZWQ4YTRkOTVkMGIpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzc3MjdkNDkwN2QzMTQ0YjRiMjM3NDIxNDg0MGI0OGVhID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF80MTJiOWIzMmU4ZTE0NzFhOTBlOTcwNTIxOThkZTU1OCA9ICQoYDxkaXYgaWQ9Imh0bWxfNDEyYjliMzJlOGUxNDcxYTkwZTk3MDUyMTk4ZGU1NTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBvcnRsYW5kLCBPUjwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF83NzI3ZDQ5MDdkMzE0NGI0YjIzNzQyMTQ4NDBiNDhlYS5zZXRDb250ZW50KGh0bWxfNDEyYjliMzJlOGUxNDcxYTkwZTk3MDUyMTk4ZGU1NTgpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNTdhYzc3YjFhMWM4NGIzZDhlYWQ0ODY3OWE1NWVmNTIuYmluZFBvcHVwKHBvcHVwXzc3MjdkNDkwN2QzMTQ0YjRiMjM3NDIxNDg0MGI0OGVhKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKPC9zY3JpcHQ+\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
      ],
      "text/plain": [
       "<folium.folium.Map at 0x7f819c447278>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m = folium.Map([45.5, -122], zoom_start=3)\n",
    "\n",
    "icon_plane = plugins.BeautifyIcon(\n",
    "    icon='plane',\n",
    "    border_color='#b3334f',\n",
    "    text_color='#b3334f',\n",
    "    icon_shape='triangle')\n",
    "\n",
    "icon_number = plugins.BeautifyIcon(\n",
    "    border_color='#00ABDC',\n",
    "    text_color='#00ABDC',\n",
    "    number=10,\n",
    "    inner_icon_style='margin-top:0;')\n",
    "\n",
    "folium.Marker(\n",
    "    location=[46, -122],\n",
    "    popup='Portland, OR',\n",
    "    icon=icon_plane\n",
    ").add_to(m)\n",
    "\n",
    "folium.Marker(\n",
    "    location=[50, -122],\n",
    "    popup='Portland, OR',\n",
    "    icon=icon_number\n",
    ").add_to(m)\n",
    "\n",
    "m.save(os.path.join('results', 'Plugins_4.html'))\n",
    "m"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Fullscreen"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgCiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgTF9OT19UT1VDSCA9IGZhbHNlOwogICAgICAgICAgICBMX0RJU0FCTEVfM0QgPSBmYWxzZTsKICAgICAgICA8L3NjcmlwdD4KICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjEyLjQubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2Nzcy9ib290c3RyYXAubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9mb250LWF3ZXNvbWUvNC42LjMvY3NzL2ZvbnQtYXdlc29tZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC4yL2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9weXRob24tdmlzdWFsaXphdGlvbi9mb2xpdW0vbWFzdGVyL2ZvbGl1bS90ZW1wbGF0ZXMvbGVhZmxldC5hd2Vzb21lLnJvdGF0ZS5jc3MiLz4KICAgIDxzdHlsZT5odG1sLCBib2R5IHt3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7bWFyZ2luOiAwO3BhZGRpbmc6IDA7fTwvc3R5bGU+CiAgICA8c3R5bGU+I21hcCB7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7cmlnaHQ6MDtsZWZ0OjA7fTwvc3R5bGU+CiAgICAKICAgICAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwKICAgICAgICAgICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgICAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAgICAgI21hcF9iYmYzYmZjNmRlMjA0NGNhYTcxZWQ4OGJjMDRlYjY3OCB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgbGVmdDogMC4wJTsKICAgICAgICAgICAgICAgICAgICB0b3A6IDAuMCU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIDwvc3R5bGU+CiAgICAgICAgCiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvbGVhZmxldC5mdWxsc2NyZWVuLzEuNC4yL0NvbnRyb2wuRnVsbFNjcmVlbi5taW4uanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9sZWFmbGV0LmZ1bGxzY3JlZW4vMS40LjIvQ29udHJvbC5GdWxsU2NyZWVuLm1pbi5jc3MiLz4KPC9oZWFkPgo8Ym9keT4gICAgCiAgICAKICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9saXVtLW1hcCIgaWQ9Im1hcF9iYmYzYmZjNmRlMjA0NGNhYTcxZWQ4OGJjMDRlYjY3OCIgPjwvZGl2PgogICAgICAgIAo8L2JvZHk+CjxzY3JpcHQ+ICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXBfYmJmM2JmYzZkZTIwNDRjYWE3MWVkODhiYzA0ZWI2NzggPSBMLm1hcCgKICAgICAgICAgICAgICAgICJtYXBfYmJmM2JmYzZkZTIwNDRjYWE3MWVkODhiYzA0ZWI2NzgiLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNlbnRlcjogWzQxLjksIC05Ny4zXSwKICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3LAogICAgICAgICAgICAgICAgICAgIHpvb206IDQsCiAgICAgICAgICAgICAgICAgICAgem9vbUNvbnRyb2w6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgcHJlZmVyQ2FudmFzOiBmYWxzZSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIAoKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl9lN2E2ZjFhYzBkMGI0YmY4YmY3MjhjODQ2ZmI3NmIyZiA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgImh0dHBzOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nIiwKICAgICAgICAgICAgICAgIHsiYXR0cmlidXRpb24iOiAiRGF0YSBieSBcdTAwMjZjb3B5OyBcdTAwM2NhIGhyZWY9XCJodHRwOi8vb3BlbnN0cmVldG1hcC5vcmdcIlx1MDAzZU9wZW5TdHJlZXRNYXBcdTAwM2MvYVx1MDAzZSwgdW5kZXIgXHUwMDNjYSBocmVmPVwiaHR0cDovL3d3dy5vcGVuc3RyZWV0bWFwLm9yZy9jb3B5cmlnaHRcIlx1MDAzZU9EYkxcdTAwM2MvYVx1MDAzZS4iLCAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsICJtYXhOYXRpdmVab29tIjogMTgsICJtYXhab29tIjogMTgsICJtaW5ab29tIjogMCwgIm5vV3JhcCI6IGZhbHNlLCAib3BhY2l0eSI6IDEsICJzdWJkb21haW5zIjogImFiYyIsICJ0bXMiOiBmYWxzZX0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmJmM2JmYzZkZTIwNDRjYWE3MWVkODhiYzA0ZWI2NzgpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIEwuY29udHJvbC5mdWxsc2NyZWVuKAogICAgICAgICAgICAgICAgeyJmb3JjZVNlcGFyYXRlQnV0dG9uIjogdHJ1ZSwgInBvc2l0aW9uIjogInRvcHJpZ2h0IiwgInRpdGxlIjogIkV4cGFuZCBtZSIsICJ0aXRsZUNhbmNlbCI6ICJFeGl0IG1lIn0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmJmM2JmYzZkZTIwNDRjYWE3MWVkODhiYzA0ZWI2NzgpOwogICAgICAgIAo8L3NjcmlwdD4=\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
      ],
      "text/plain": [
       "<folium.folium.Map at 0x7f819c436f98>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m = folium.Map(location=[41.9, -97.3], zoom_start=4)\n",
    "\n",
    "plugins.Fullscreen(\n",
    "    position='topright',\n",
    "    title='Expand me',\n",
    "    title_cancel='Exit me',\n",
    "    force_separate_button=True\n",
    ").add_to(m)\n",
    "\n",
    "m.save(os.path.join('results', 'Plugins_5.html'))\n",
    "m"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##  Timestamped GeoJSON"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgCiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgTF9OT19UT1VDSCA9IGZhbHNlOwogICAgICAgICAgICBMX0RJU0FCTEVfM0QgPSBmYWxzZTsKICAgICAgICA8L3NjcmlwdD4KICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjEyLjQubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2Nzcy9ib290c3RyYXAubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9mb250LWF3ZXNvbWUvNC42LjMvY3NzL2ZvbnQtYXdlc29tZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC4yL2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9weXRob24tdmlzdWFsaXphdGlvbi9mb2xpdW0vbWFzdGVyL2ZvbGl1bS90ZW1wbGF0ZXMvbGVhZmxldC5hd2Vzb21lLnJvdGF0ZS5jc3MiLz4KICAgIDxzdHlsZT5odG1sLCBib2R5IHt3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7bWFyZ2luOiAwO3BhZGRpbmc6IDA7fTwvc3R5bGU+CiAgICA8c3R5bGU+I21hcCB7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7cmlnaHQ6MDtsZWZ0OjA7fTwvc3R5bGU+CiAgICAKICAgICAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwKICAgICAgICAgICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgICAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAgICAgI21hcF9lYjI5ODBjYjJhNzQ0MmJkYTY2YmRlNTJkODI4YWQ0MiB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgbGVmdDogMC4wJTsKICAgICAgICAgICAgICAgICAgICB0b3A6IDAuMCU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIDwvc3R5bGU+CiAgICAgICAgCiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvanF1ZXJ5LzIuMC4wL2pxdWVyeS5taW4uanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2pxdWVyeXVpLzEuMTAuMi9qcXVlcnktdWkubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9uZXphc2EvaXNvODYwMS1qcy1wZXJpb2QvbWFzdGVyL2lzbzg2MDEubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9zb2NpYi9MZWFmbGV0LlRpbWVEaW1lbnNpb24vbWFzdGVyL2Rpc3QvbGVhZmxldC50aW1lZGltZW5zaW9uLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2hpZ2hsaWdodC5qcy84LjQvc3R5bGVzL2RlZmF1bHQubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9zb2NpYi9MZWFmbGV0LlRpbWVEaW1lbnNpb24vbWFzdGVyL2Rpc3QvbGVhZmxldC50aW1lZGltZW5zaW9uLmNvbnRyb2wubWluLmNzcyIvPgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL21vbWVudC5qcy8yLjE4LjEvbW9tZW50Lm1pbi5qcyI+PC9zY3JpcHQ+CjwvaGVhZD4KPGJvZHk+ICAgIAogICAgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvbGl1bS1tYXAiIGlkPSJtYXBfZWIyOTgwY2IyYTc0NDJiZGE2NmJkZTUyZDgyOGFkNDIiID48L2Rpdj4KICAgICAgICAKPC9ib2R5Pgo8c2NyaXB0PiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFwX2ViMjk4MGNiMmE3NDQyYmRhNjZiZGU1MmQ4MjhhZDQyID0gTC5tYXAoCiAgICAgICAgICAgICAgICAibWFwX2ViMjk4MGNiMmE3NDQyYmRhNjZiZGU1MmQ4MjhhZDQyIiwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjZW50ZXI6IFszNS42ODE1OTY1OTA2MTU2OSwgMTM5Ljc2NDUxNTE2MTUxNDI4XSwKICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3LAogICAgICAgICAgICAgICAgICAgIHpvb206IDE2LAogICAgICAgICAgICAgICAgICAgIHpvb21Db250cm9sOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHByZWZlckNhbnZhczogZmFsc2UsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICAKCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfODUwMGU0ZDZhOGFmNDg0NmE5MjliMTZlNjI5YmQwMWEgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICJodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZyIsCiAgICAgICAgICAgICAgICB7ImF0dHJpYnV0aW9uIjogIkRhdGEgYnkgXHUwMDI2Y29weTsgXHUwMDNjYSBocmVmPVwiaHR0cDovL29wZW5zdHJlZXRtYXAub3JnXCJcdTAwM2VPcGVuU3RyZWV0TWFwXHUwMDNjL2FcdTAwM2UsIHVuZGVyIFx1MDAzY2EgaHJlZj1cImh0dHA6Ly93d3cub3BlbnN0cmVldG1hcC5vcmcvY29weXJpZ2h0XCJcdTAwM2VPRGJMXHUwMDNjL2FcdTAwM2UuIiwgImRldGVjdFJldGluYSI6IGZhbHNlLCAibWF4TmF0aXZlWm9vbSI6IDE4LCAibWF4Wm9vbSI6IDE4LCAibWluWm9vbSI6IDAsICJub1dyYXAiOiBmYWxzZSwgIm9wYWNpdHkiOiAxLCAic3ViZG9tYWlucyI6ICJhYmMiLCAidG1zIjogZmFsc2V9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2ViMjk4MGNiMmE3NDQyYmRhNjZiZGU1MmQ4MjhhZDQyKTsKICAgICAgICAKICAgIAogICAgICAgICAgICBMLkNvbnRyb2wuVGltZURpbWVuc2lvbkN1c3RvbSA9IEwuQ29udHJvbC5UaW1lRGltZW5zaW9uLmV4dGVuZCh7CiAgICAgICAgICAgICAgICBfZ2V0RGlzcGxheURhdGVGb3JtYXQ6IGZ1bmN0aW9uKGRhdGUpewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdkYXRlID0gbmV3IG1vbWVudChkYXRlKTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhuZXdkYXRlKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdkYXRlLmZvcm1hdCgiWVlZWS1NTS1ERCBISDptbTpzcyIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgbWFwX2ViMjk4MGNiMmE3NDQyYmRhNjZiZGU1MmQ4MjhhZDQyLnRpbWVEaW1lbnNpb24gPSBMLnRpbWVEaW1lbnNpb24oCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcGVyaW9kOiAiUFQxTSIsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHZhciB0aW1lRGltZW5zaW9uQ29udHJvbCA9IG5ldyBMLkNvbnRyb2wuVGltZURpbWVuc2lvbkN1c3RvbSgKICAgICAgICAgICAgICAgIHsiYXV0b1BsYXkiOiB0cnVlLCAibG9vcEJ1dHRvbiI6IGZhbHNlLCAibWF4U3BlZWQiOiAxMCwgIm1pblNwZWVkIjogMC4xLCAicGxheWVyT3B0aW9ucyI6IHsibG9vcCI6IHRydWUsICJzdGFydE92ZXIiOiB0cnVlLCAidHJhbnNpdGlvblRpbWUiOiAyMDB9LCAicG9zaXRpb24iOiAiYm90dG9tbGVmdCIsICJ0aW1lU2xpZGVyRHJhZ1VwZGF0ZSI6IGZhbHNlfQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXBfZWIyOTgwY2IyYTc0NDJiZGE2NmJkZTUyZDgyOGFkNDIuYWRkQ29udHJvbCh0aGlzLnRpbWVEaW1lbnNpb25Db250cm9sKTsKCiAgICAgICAgICAgIHZhciBnZW9Kc29uTGF5ZXIgPSBMLmdlb0pzb24oeyJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIiwgImZlYXR1cmVzIjogW3sidHlwZSI6ICJGZWF0dXJlIiwgImdlb21ldHJ5IjogeyJ0eXBlIjogIkxpbmVTdHJpbmciLCAiY29vcmRpbmF0ZXMiOiBbWzEzOS43NjQ1MTUxNjE1MTQyOCwgMzUuNjgxNTk2NTkwNjE1NjldLCBbMTM5Ljc1OTY0NDI2OTk0MzI0LCAzNS42ODI1OTAwNjI2ODQyMDZdXX0sICJwcm9wZXJ0aWVzIjogeyJ0aW1lcyI6IFsiMjAxNy0wNi0wMlQwMDowMDowMCIsICIyMDE3LTA2LTAyVDAwOjEwOjAwIl0sICJzdHlsZSI6IHsiY29sb3IiOiAicmVkIiwgIndlaWdodCI6IDV9fX0sIHsidHlwZSI6ICJGZWF0dXJlIiwgImdlb21ldHJ5IjogeyJ0eXBlIjogIkxpbmVTdHJpbmciLCAiY29vcmRpbmF0ZXMiOiBbWzEzOS43NTk2NDQyNjk5NDMyNCwgMzUuNjgyNTkwMDYyNjg0MjA2XSwgWzEzOS43NTc1ODQzMzM0MTk4LCAzNS42Nzk1MDUwMzAwMzg1MDZdXX0sICJwcm9wZXJ0aWVzIjogeyJ0aW1lcyI6IFsiMjAxNy0wNi0wMlQwMDoxMDowMCIsICIyMDE3LTA2LTAyVDAwOjIwOjAwIl0sICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJ3ZWlnaHQiOiA1fX19LCB7InR5cGUiOiAiRmVhdHVyZSIsICJnZW9tZXRyeSI6IHsidHlwZSI6ICJMaW5lU3RyaW5nIiwgImNvb3JkaW5hdGVzIjogW1sxMzkuNzU3NTg0MzMzNDE5OCwgMzUuNjc5NTA1MDMwMDM4NTA2XSwgWzEzOS43NjMzNzc5MDQ4OTE5NywgMzUuNjc4MDQwOTA1MDE0MDY1XV19LCAicHJvcGVydGllcyI6IHsidGltZXMiOiBbIjIwMTctMDYtMDJUMDA6MjA6MDAiLCAiMjAxNy0wNi0wMlQwMDozMDowMCJdLCAic3R5bGUiOiB7ImNvbG9yIjogImdyZWVuIiwgIndlaWdodCI6IDE1fX19LCB7InR5cGUiOiAiRmVhdHVyZSIsICJnZW9tZXRyeSI6IHsidHlwZSI6ICJMaW5lU3RyaW5nIiwgImNvb3JkaW5hdGVzIjogW1sxMzkuNzYzMzc3OTA0ODkxOTcsIDM1LjY3ODA0MDkwNTAxNDA2NV0sIFsxMzkuNzY0NTE1MTYxNTE0MjgsIDM1LjY4MTU5NjU5MDYxNTY5XV19LCAicHJvcGVydGllcyI6IHsidGltZXMiOiBbIjIwMTctMDYtMDJUMDA6MzA6MDAiLCAiMjAxNy0wNi0wMlQwMDo0MDowMCJdLCAic3R5bGUiOiB7ImNvbG9yIjogIiNGRkZGRkYiLCAid2VpZ2h0IjogNX19fV19LCB7CiAgICAgICAgICAgICAgICAgICAgcG9pbnRUb0xheWVyOiBmdW5jdGlvbiAoZmVhdHVyZSwgbGF0TG5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmZWF0dXJlLnByb3BlcnRpZXMuaWNvbiA9PSAnbWFya2VyJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZmVhdHVyZS5wcm9wZXJ0aWVzLmljb25zdHlsZSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMLk1hcmtlcihsYXRMbmcsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogTC5pY29uKGZlYXR1cmUucHJvcGVydGllcy5pY29uc3R5bGUpfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2Vsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTC5NYXJrZXIobGF0TG5nKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmVhdHVyZS5wcm9wZXJ0aWVzLmljb24gPT0gJ2NpcmNsZScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmZWF0dXJlLnByb3BlcnRpZXMuaWNvbnN0eWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMLmNpcmNsZU1hcmtlcihsYXRMbmcsIGZlYXR1cmUucHJvcGVydGllcy5pY29uc3R5bGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMLmNpcmNsZU1hcmtlcihsYXRMbmcpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC8vZWxzZQoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMLk1hcmtlcihsYXRMbmcpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgc3R5bGU6IGZ1bmN0aW9uIChmZWF0dXJlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBmdW5jdGlvbihmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmVhdHVyZS5wcm9wZXJ0aWVzLnBvcHVwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLmJpbmRQb3B1cChmZWF0dXJlLnByb3BlcnRpZXMucG9wdXApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgIHZhciB0aW1lc3RhbXBlZF9nZW9fanNvbl9kOGViYzhlYzU3NjE0MjQ2ODNkOTliZmQ5ZTdiN2I1YiA9IEwudGltZURpbWVuc2lvbi5sYXllci5nZW9Kc29uKAogICAgICAgICAgICAgICAgZ2VvSnNvbkxheWVyLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHVwZGF0ZVRpbWVEaW1lbnNpb246IHRydWUsCiAgICAgICAgICAgICAgICAgICAgYWRkbGFzdFBvaW50OiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiB1bmRlZmluZWQsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2ViMjk4MGNiMmE3NDQyYmRhNjZiZGU1MmQ4MjhhZDQyKTsKICAgICAgICAKPC9zY3JpcHQ+\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
      ],
      "text/plain": [
       "<folium.folium.Map at 0x7f819c467588>"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m = folium.Map(\n",
    "    location=[35.68159659061569, 139.76451516151428],\n",
    "    zoom_start=16\n",
    ")\n",
    "\n",
    "# Lon, Lat order.\n",
    "lines = [\n",
    "    {\n",
    "        'coordinates': [\n",
    "            [139.76451516151428, 35.68159659061569],\n",
    "            [139.75964426994324, 35.682590062684206],\n",
    "        ],\n",
    "        'dates': [\n",
    "            '2017-06-02T00:00:00',\n",
    "            '2017-06-02T00:10:00'\n",
    "        ],\n",
    "        'color': 'red'\n",
    "    },\n",
    "    {\n",
    "        'coordinates': [\n",
    "            [139.75964426994324, 35.682590062684206],\n",
    "            [139.7575843334198, 35.679505030038506],\n",
    "        ],\n",
    "        'dates': [\n",
    "            '2017-06-02T00:10:00',\n",
    "            '2017-06-02T00:20:00'\n",
    "        ],\n",
    "        'color': 'blue'\n",
    "    },\n",
    "    {\n",
    "        'coordinates': [\n",
    "            [139.7575843334198, 35.679505030038506],\n",
    "            [139.76337790489197, 35.678040905014065],\n",
    "        ],\n",
    "        'dates': [\n",
    "            '2017-06-02T00:20:00',\n",
    "            '2017-06-02T00:30:00'\n",
    "        ],\n",
    "        'color': 'green',\n",
    "        'weight': 15,\n",
    "    },\n",
    "    {\n",
    "        'coordinates': [\n",
    "            [139.76337790489197, 35.678040905014065],\n",
    "            [139.76451516151428, 35.68159659061569],\n",
    "        ],\n",
    "        'dates': [\n",
    "            '2017-06-02T00:30:00',\n",
    "            '2017-06-02T00:40:00'\n",
    "        ],\n",
    "        'color': '#FFFFFF',\n",
    "    },\n",
    "]\n",
    "\n",
    "features = [\n",
    "    {\n",
    "        'type': 'Feature',\n",
    "        'geometry': {\n",
    "            'type': 'LineString',\n",
    "            'coordinates': line['coordinates'],\n",
    "        },\n",
    "        'properties': {\n",
    "            'times': line['dates'],\n",
    "            'style': {\n",
    "                'color': line['color'],\n",
    "                'weight': line['weight'] if 'weight' in line else 5\n",
    "            }\n",
    "        }\n",
    "    }\n",
    "    for line in lines\n",
    "]\n",
    "\n",
    "plugins.TimestampedGeoJson({\n",
    "    'type': 'FeatureCollection',\n",
    "    'features': features,\n",
    "}, period='PT1M', add_last_point=True).add_to(m)\n",
    "\n",
    "m.save(os.path.join('results', 'Plugins_6.html'))\n",
    "m"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgCiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgTF9OT19UT1VDSCA9IGZhbHNlOwogICAgICAgICAgICBMX0RJU0FCTEVfM0QgPSBmYWxzZTsKICAgICAgICA8L3NjcmlwdD4KICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjEyLjQubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2Nzcy9ib290c3RyYXAubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9mb250LWF3ZXNvbWUvNC42LjMvY3NzL2ZvbnQtYXdlc29tZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC4yL2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9weXRob24tdmlzdWFsaXphdGlvbi9mb2xpdW0vbWFzdGVyL2ZvbGl1bS90ZW1wbGF0ZXMvbGVhZmxldC5hd2Vzb21lLnJvdGF0ZS5jc3MiLz4KICAgIDxzdHlsZT5odG1sLCBib2R5IHt3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7bWFyZ2luOiAwO3BhZGRpbmc6IDA7fTwvc3R5bGU+CiAgICA8c3R5bGU+I21hcCB7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7cmlnaHQ6MDtsZWZ0OjA7fTwvc3R5bGU+CiAgICAKICAgICAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwKICAgICAgICAgICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgICAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAgICAgI21hcF9kY2IzMTZhODQ3YTg0YjgyOTM5NDg2ODU4ZjU1ZjhkNCB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgbGVmdDogMC4wJTsKICAgICAgICAgICAgICAgICAgICB0b3A6IDAuMCU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIDwvc3R5bGU+CiAgICAgICAgCiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvanF1ZXJ5LzIuMC4wL2pxdWVyeS5taW4uanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2pxdWVyeXVpLzEuMTAuMi9qcXVlcnktdWkubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9uZXphc2EvaXNvODYwMS1qcy1wZXJpb2QvbWFzdGVyL2lzbzg2MDEubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9zb2NpYi9MZWFmbGV0LlRpbWVEaW1lbnNpb24vbWFzdGVyL2Rpc3QvbGVhZmxldC50aW1lZGltZW5zaW9uLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2hpZ2hsaWdodC5qcy84LjQvc3R5bGVzL2RlZmF1bHQubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9zb2NpYi9MZWFmbGV0LlRpbWVEaW1lbnNpb24vbWFzdGVyL2Rpc3QvbGVhZmxldC50aW1lZGltZW5zaW9uLmNvbnRyb2wubWluLmNzcyIvPgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL21vbWVudC5qcy8yLjE4LjEvbW9tZW50Lm1pbi5qcyI+PC9zY3JpcHQ+CjwvaGVhZD4KPGJvZHk+ICAgIAogICAgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvbGl1bS1tYXAiIGlkPSJtYXBfZGNiMzE2YTg0N2E4NGI4MjkzOTQ4Njg1OGY1NWY4ZDQiID48L2Rpdj4KICAgICAgICAKPC9ib2R5Pgo8c2NyaXB0PiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFwX2RjYjMxNmE4NDdhODRiODI5Mzk0ODY4NThmNTVmOGQ0ID0gTC5tYXAoCiAgICAgICAgICAgICAgICAibWFwX2RjYjMxNmE4NDdhODRiODI5Mzk0ODY4NThmNTVmOGQ0IiwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjZW50ZXI6IFs1Ni4wOTY1NTUsIC0zLjY0NzQ2XSwKICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3LAogICAgICAgICAgICAgICAgICAgIHpvb206IDUsCiAgICAgICAgICAgICAgICAgICAgem9vbUNvbnRyb2w6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgcHJlZmVyQ2FudmFzOiBmYWxzZSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIAoKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl9hNzY3MjlmZmNlM2Q0MDM0YmY0OGY1OGExY2MxNDY2YiA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgImh0dHBzOi8vY2FydG9kYi1iYXNlbWFwcy17c30uZ2xvYmFsLnNzbC5mYXN0bHkubmV0L2xpZ2h0X2FsbC97en0ve3h9L3t5fS5wbmciLAogICAgICAgICAgICAgICAgeyJhdHRyaWJ1dGlvbiI6ICJcdTAwMjZjb3B5OyBcdTAwM2NhIGhyZWY9XCJodHRwOi8vd3d3Lm9wZW5zdHJlZXRtYXAub3JnL2NvcHlyaWdodFwiXHUwMDNlT3BlblN0cmVldE1hcFx1MDAzYy9hXHUwMDNlIGNvbnRyaWJ1dG9ycyBcdTAwMjZjb3B5OyBcdTAwM2NhIGhyZWY9XCJodHRwOi8vY2FydG9kYi5jb20vYXR0cmlidXRpb25zXCJcdTAwM2VDYXJ0b0RCXHUwMDNjL2FcdTAwM2UsIENhcnRvREIgXHUwMDNjYSBocmVmID1cImh0dHA6Ly9jYXJ0b2RiLmNvbS9hdHRyaWJ1dGlvbnNcIlx1MDAzZWF0dHJpYnV0aW9uc1x1MDAzYy9hXHUwMDNlIiwgImRldGVjdFJldGluYSI6IGZhbHNlLCAibWF4TmF0aXZlWm9vbSI6IDE4LCAibWF4Wm9vbSI6IDE4LCAibWluWm9vbSI6IDAsICJub1dyYXAiOiBmYWxzZSwgIm9wYWNpdHkiOiAxLCAic3ViZG9tYWlucyI6ICJhYmMiLCAidG1zIjogZmFsc2V9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2RjYjMxNmE4NDdhODRiODI5Mzk0ODY4NThmNTVmOGQ0KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBMLkNvbnRyb2wuVGltZURpbWVuc2lvbkN1c3RvbSA9IEwuQ29udHJvbC5UaW1lRGltZW5zaW9uLmV4dGVuZCh7CiAgICAgICAgICAgICAgICBfZ2V0RGlzcGxheURhdGVGb3JtYXQ6IGZ1bmN0aW9uKGRhdGUpewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdkYXRlID0gbmV3IG1vbWVudChkYXRlKTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhuZXdkYXRlKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdkYXRlLmZvcm1hdCgiWVlZWS9NTS9ERCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgbWFwX2RjYjMxNmE4NDdhODRiODI5Mzk0ODY4NThmNTVmOGQ0LnRpbWVEaW1lbnNpb24gPSBMLnRpbWVEaW1lbnNpb24oCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcGVyaW9kOiAiUDFNIiwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgdmFyIHRpbWVEaW1lbnNpb25Db250cm9sID0gbmV3IEwuQ29udHJvbC5UaW1lRGltZW5zaW9uQ3VzdG9tKAogICAgICAgICAgICAgICAgeyJhdXRvUGxheSI6IGZhbHNlLCAibG9vcEJ1dHRvbiI6IHRydWUsICJtYXhTcGVlZCI6IDEsICJtaW5TcGVlZCI6IDAuMSwgInBsYXllck9wdGlvbnMiOiB7Imxvb3AiOiBmYWxzZSwgInN0YXJ0T3ZlciI6IHRydWUsICJ0cmFuc2l0aW9uVGltZSI6IDIwMH0sICJwb3NpdGlvbiI6ICJib3R0b21sZWZ0IiwgInRpbWVTbGlkZXJEcmFnVXBkYXRlIjogdHJ1ZX0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFwX2RjYjMxNmE4NDdhODRiODI5Mzk0ODY4NThmNTVmOGQ0LmFkZENvbnRyb2wodGhpcy50aW1lRGltZW5zaW9uQ29udHJvbCk7CgogICAgICAgICAgICB2YXIgZ2VvSnNvbkxheWVyID0gTC5nZW9Kc29uKHsidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiIsICJmZWF0dXJlcyI6IFt7InR5cGUiOiAiRmVhdHVyZSIsICJnZW9tZXRyeSI6IHsidHlwZSI6ICJQb2ludCIsICJjb29yZGluYXRlcyI6IFstMi41NDg4MjgsIDUxLjQ2NzY5N119LCAicHJvcGVydGllcyI6IHsidGltZSI6ICIyMDE3LTA2LTAyIiwgInBvcHVwIjogIjxoMT5hZGRyZXNzMTwvaDE+IiwgImlkIjogImhvdXNlIiwgImljb24iOiAibWFya2VyIiwgImljb25zdHlsZSI6IHsiaWNvblVybCI6ICJodHRwOi8vZG93bmxvYWRpY29ucy5uZXQvc2l0ZXMvZGVmYXVsdC9maWxlcy9zbWFsbC1ob3VzZS13aXRoLWEtY2hpbW5leS1pY29uLTcwMDUzLnBuZyIsICJpY29uU2l6ZSI6IFsyMCwgMjBdfX19LCB7InR5cGUiOiAiRmVhdHVyZSIsICJnZW9tZXRyeSI6IHsidHlwZSI6ICJQb2ludCIsICJjb29yZGluYXRlcyI6IFstMC4wODc4OTEsIDUxLjUzNjA4Nl19LCAicHJvcGVydGllcyI6IHsidGltZSI6ICIyMDE3LTA3LTAyIiwgInBvcHVwIjogIjxoMiBzdHlsZT0nY29sb3I6Ymx1ZTsnPmFkZHJlc3MyPGgyPiIsICJpZCI6ICJob3VzZSIsICJpY29uIjogIm1hcmtlciIsICJpY29uc3R5bGUiOiB7Imljb25VcmwiOiAiaHR0cDovL2Rvd25sb2FkaWNvbnMubmV0L3NpdGVzL2RlZmF1bHQvZmlsZXMvc21hbGwtaG91c2Utd2l0aC1hLWNoaW1uZXktaWNvbi03MDA1My5wbmciLCAiaWNvblNpemUiOiBbMjAsIDIwXX19fSwgeyJ0eXBlIjogIkZlYXR1cmUiLCAiZ2VvbWV0cnkiOiB7InR5cGUiOiAiUG9pbnQiLCAiY29vcmRpbmF0ZXMiOiBbLTYuMjQwMjM0LCA1My4zODMzMjhdfSwgInByb3BlcnRpZXMiOiB7InRpbWUiOiAiMjAxNy0wOC0wMiIsICJwb3B1cCI6ICI8aDIgc3R5bGU9J2NvbG9yOm9yYW5nZTsnPmFkZHJlc3MzPGgyPiIsICJpZCI6ICJob3VzZSIsICJpY29uIjogIm1hcmtlciIsICJpY29uc3R5bGUiOiB7Imljb25VcmwiOiAiaHR0cDovL2Rvd25sb2FkaWNvbnMubmV0L3NpdGVzL2RlZmF1bHQvZmlsZXMvc21hbGwtaG91c2Utd2l0aC1hLWNoaW1uZXktaWNvbi03MDA1My5wbmciLCAiaWNvblNpemUiOiBbMjAsIDIwXX19fSwgeyJ0eXBlIjogIkZlYXR1cmUiLCAiZ2VvbWV0cnkiOiB7InR5cGUiOiAiUG9pbnQiLCAiY29vcmRpbmF0ZXMiOiBbLTEuNDA2MjUsIDYwLjI2MTYxN119LCAicHJvcGVydGllcyI6IHsidGltZSI6ICIyMDE3LTA5LTAyIiwgInBvcHVwIjogIjxoMiBzdHlsZT0nY29sb3I6Z3JlZW47Jz5hZGRyZXNzNDxoMj4iLCAiaWQiOiAiaG91c2UiLCAiaWNvbiI6ICJtYXJrZXIiLCAiaWNvbnN0eWxlIjogeyJpY29uVXJsIjogImh0dHA6Ly9kb3dubG9hZGljb25zLm5ldC9zaXRlcy9kZWZhdWx0L2ZpbGVzL3NtYWxsLWhvdXNlLXdpdGgtYS1jaGltbmV5LWljb24tNzAwNTMucG5nIiwgImljb25TaXplIjogWzIwLCAyMF19fX0sIHsidHlwZSI6ICJGZWF0dXJlIiwgImdlb21ldHJ5IjogeyJ0eXBlIjogIlBvaW50IiwgImNvb3JkaW5hdGVzIjogWy0xLjUxNjExMywgNTMuODAwNjUxXX0sICJwcm9wZXJ0aWVzIjogeyJ0aW1lIjogIjIwMTctMTAtMDIiLCAicG9wdXAiOiAiPHRhYmxlIHN0eWxlPSd3aWR0aDoxMDAlJz5cbiAgPHRyPlxuICAgIDx0aD5GaXJzdG5hbWU8L3RoPlxuICAgIDx0aD5MYXN0bmFtZTwvdGg+XG4gICAgPHRoPkFnZTwvdGg+XG4gIDwvdHI+XG4gIDx0cj5cbiAgICA8dGQ+SmlsbDwvdGQ+XG4gICAgPHRkPlNtaXRoPC90ZD5cbiAgICA8dGQ+NTA8L3RkPlxuICA8L3RyPlxuICA8dHI+XG4gICAgPHRkPkV2ZTwvdGQ+XG4gICAgPHRkPkphY2tzb248L3RkPlxuICAgIDx0ZD45NDwvdGQ+XG4gIDwvdHI+XG48L3RhYmxlPlxuIiwgImlkIjogImhvdXNlIiwgImljb24iOiAibWFya2VyIiwgImljb25zdHlsZSI6IHsiaWNvblVybCI6ICJodHRwOi8vZG93bmxvYWRpY29ucy5uZXQvc2l0ZXMvZGVmYXVsdC9maWxlcy9zbWFsbC1ob3VzZS13aXRoLWEtY2hpbW5leS1pY29uLTcwMDUzLnBuZyIsICJpY29uU2l6ZSI6IFsyMCwgMjBdfX19LCB7InR5cGUiOiAiRmVhdHVyZSIsICJnZW9tZXRyeSI6IHsidHlwZSI6ICJMaW5lU3RyaW5nIiwgImNvb3JkaW5hdGVzIjogW1stMi41NDg4MjgsIDUxLjQ2NzY5N10sIFstMC4wODc4OTEsIDUxLjUzNjA4Nl0sIFstNi4yNDAyMzQsIDUzLjM4MzMyOF0sIFstMS40MDYyNSwgNjAuMjYxNjE3XSwgWy0xLjUxNjExMywgNTMuODAwNjUxXV19LCAicHJvcGVydGllcyI6IHsicG9wdXAiOiAiQ3VycmVudCBhZGRyZXNzIiwgInRpbWVzIjogWyIyMDE3LTA2LTAyIiwgIjIwMTctMDctMDIiLCAiMjAxNy0wOC0wMiIsICIyMDE3LTA5LTAyIiwgIjIwMTctMTAtMDIiXSwgImljb24iOiAiY2lyY2xlIiwgImljb25zdHlsZSI6IHsiZmlsbENvbG9yIjogImdyZWVuIiwgImZpbGxPcGFjaXR5IjogMC42LCAic3Ryb2tlIjogImZhbHNlIiwgInJhZGl1cyI6IDEzfSwgInN0eWxlIjogeyJ3ZWlnaHQiOiAwfSwgImlkIjogIm1hbiJ9fV19LCB7CiAgICAgICAgICAgICAgICAgICAgcG9pbnRUb0xheWVyOiBmdW5jdGlvbiAoZmVhdHVyZSwgbGF0TG5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmZWF0dXJlLnByb3BlcnRpZXMuaWNvbiA9PSAnbWFya2VyJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZmVhdHVyZS5wcm9wZXJ0aWVzLmljb25zdHlsZSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMLk1hcmtlcihsYXRMbmcsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogTC5pY29uKGZlYXR1cmUucHJvcGVydGllcy5pY29uc3R5bGUpfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2Vsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTC5NYXJrZXIobGF0TG5nKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmVhdHVyZS5wcm9wZXJ0aWVzLmljb24gPT0gJ2NpcmNsZScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmZWF0dXJlLnByb3BlcnRpZXMuaWNvbnN0eWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMLmNpcmNsZU1hcmtlcihsYXRMbmcsIGZlYXR1cmUucHJvcGVydGllcy5pY29uc3R5bGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMLmNpcmNsZU1hcmtlcihsYXRMbmcpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC8vZWxzZQoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMLk1hcmtlcihsYXRMbmcpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgc3R5bGU6IGZ1bmN0aW9uIChmZWF0dXJlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBmdW5jdGlvbihmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmVhdHVyZS5wcm9wZXJ0aWVzLnBvcHVwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLmJpbmRQb3B1cChmZWF0dXJlLnByb3BlcnRpZXMucG9wdXApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgIHZhciB0aW1lc3RhbXBlZF9nZW9fanNvbl83YjAyZmNmYWQ5MzA0YjZiODI4OTU4YTU0MzIxMzYzYSA9IEwudGltZURpbWVuc2lvbi5sYXllci5nZW9Kc29uKAogICAgICAgICAgICAgICAgZ2VvSnNvbkxheWVyLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHVwZGF0ZVRpbWVEaW1lbnNpb246IHRydWUsCiAgICAgICAgICAgICAgICAgICAgYWRkbGFzdFBvaW50OiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAiUDJNIiwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGNiMzE2YTg0N2E4NGI4MjkzOTQ4Njg1OGY1NWY4ZDQpOwogICAgICAgIAo8L3NjcmlwdD4=\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
      ],
      "text/plain": [
       "<folium.folium.Map at 0x7f819c418da0>"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "table = \"\"\"\\\n",
    "<table style=\\'width:100%\\'>\n",
    "  <tr>\n",
    "    <th>Firstname</th>\n",
    "    <th>Lastname</th>\n",
    "    <th>Age</th>\n",
    "  </tr>\n",
    "  <tr>\n",
    "    <td>Jill</td>\n",
    "    <td>Smith</td>\n",
    "    <td>50</td>\n",
    "  </tr>\n",
    "  <tr>\n",
    "    <td>Eve</td>\n",
    "    <td>Jackson</td>\n",
    "    <td>94</td>\n",
    "  </tr>\n",
    "</table>\n",
    "\"\"\"\n",
    "\n",
    "points = [\n",
    "    {\n",
    "        'time': '2017-06-02',\n",
    "        'popup': '<h1>address1</h1>',\n",
    "        'coordinates': [-2.548828, 51.467697]\n",
    "    },\n",
    "    {\n",
    "        'time': '2017-07-02',\n",
    "        'popup': '<h2 style=\\'color:blue;\\'>address2<h2>',\n",
    "        'coordinates': [-0.087891, 51.536086]\n",
    "    },\n",
    "    {\n",
    "        'time': '2017-08-02',\n",
    "        'popup': '<h2 style=\\'color:orange;\\'>address3<h2>',\n",
    "        'coordinates': [-6.240234, 53.383328]\n",
    "    },\n",
    "    {\n",
    "        'time': '2017-09-02',\n",
    "        'popup': '<h2 style=\\'color:green;\\'>address4<h2>',\n",
    "        'coordinates': [-1.40625, 60.261617]},\n",
    "    {\n",
    "        'time': '2017-10-02',\n",
    "        'popup': table,\n",
    "        'coordinates': [-1.516113, 53.800651]}\n",
    "]\n",
    "\n",
    "features = [\n",
    "    {\n",
    "        'type': 'Feature',\n",
    "        'geometry': {\n",
    "            'type': 'Point',\n",
    "            'coordinates': point['coordinates'],\n",
    "        },\n",
    "        'properties': {\n",
    "            'time': point['time'],\n",
    "            'popup': point['popup'],\n",
    "            'id': 'house',\n",
    "            'icon': 'marker',\n",
    "            'iconstyle': {\n",
    "                'iconUrl': 'http://downloadicons.net/sites/default/files/small-house-with-a-chimney-icon-70053.png',\n",
    "                'iconSize': [20, 20]\n",
    "            }\n",
    "        }\n",
    "    } for point in points\n",
    "]\n",
    "\n",
    "features.append(\n",
    "    {\n",
    "        'type': 'Feature',\n",
    "        'geometry': {\n",
    "            'type': 'LineString',\n",
    "            'coordinates': [\n",
    "                [-2.548828, 51.467697],\n",
    "                [-0.087891, 51.536086],\n",
    "                [-6.240234, 53.383328],\n",
    "                [-1.40625, 60.261617],\n",
    "                [-1.516113, 53.800651]\n",
    "            ],\n",
    "        },\n",
    "        'properties': {\n",
    "            'popup': 'Current address',\n",
    "            'times': [\n",
    "                '2017-06-02',\n",
    "                '2017-07-02',\n",
    "                '2017-08-02',\n",
    "                '2017-09-02',\n",
    "                '2017-10-02'\n",
    "            ],\n",
    "            'icon': 'circle',\n",
    "            'iconstyle': {\n",
    "                'fillColor': 'green',\n",
    "                'fillOpacity': 0.6,\n",
    "                'stroke': 'false',\n",
    "                'radius': 13\n",
    "            },\n",
    "            'style': {'weight': 0},\n",
    "            'id': 'man'\n",
    "        }\n",
    "    }\n",
    ")\n",
    "\n",
    "m = folium.Map(\n",
    "    location=[56.096555, -3.64746],\n",
    "    tiles='cartodbpositron',\n",
    "    zoom_start=5,\n",
    ")\n",
    "\n",
    "plugins.TimestampedGeoJson(\n",
    "    {\n",
    "        'type': 'FeatureCollection',\n",
    "        'features': features\n",
    "    },\n",
    "    period='P1M',\n",
    "    add_last_point=True,\n",
    "    auto_play=False,\n",
    "    loop=False,\n",
    "    max_speed=1,\n",
    "    loop_button=True,\n",
    "    date_options='YYYY/MM/DD',\n",
    "    time_slider_drag_update=True,\n",
    "    duration='P2M'\n",
    ").add_to(m)\n",
    "\n",
    "m.save(os.path.join('results', 'Plugins_7.html'))\n",
    "m"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## FeatureGroupSubGroup\n",
    "\n",
    "### Sub categories\n",
    "\n",
    "Disable all markers in the category, or just one of the subgroup."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgCiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgTF9OT19UT1VDSCA9IGZhbHNlOwogICAgICAgICAgICBMX0RJU0FCTEVfM0QgPSBmYWxzZTsKICAgICAgICA8L3NjcmlwdD4KICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjEyLjQubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2Nzcy9ib290c3RyYXAubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9mb250LWF3ZXNvbWUvNC42LjMvY3NzL2ZvbnQtYXdlc29tZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC4yL2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9weXRob24tdmlzdWFsaXphdGlvbi9mb2xpdW0vbWFzdGVyL2ZvbGl1bS90ZW1wbGF0ZXMvbGVhZmxldC5hd2Vzb21lLnJvdGF0ZS5jc3MiLz4KICAgIDxzdHlsZT5odG1sLCBib2R5IHt3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7bWFyZ2luOiAwO3BhZGRpbmc6IDA7fTwvc3R5bGU+CiAgICA8c3R5bGU+I21hcCB7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7cmlnaHQ6MDtsZWZ0OjA7fTwvc3R5bGU+CiAgICAKICAgICAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwKICAgICAgICAgICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgICAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAgICAgI21hcF9iYjZlYmIxNDNjYzI0YzEwOWFiNDg2OTQxOGQwOGM3YSB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgbGVmdDogMC4wJTsKICAgICAgICAgICAgICAgICAgICB0b3A6IDAuMCU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIDwvc3R5bGU+CiAgICAgICAgCiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly91bnBrZy5jb20vbGVhZmxldC5mZWF0dXJlZ3JvdXAuc3ViZ3JvdXBAMS4wLjIvZGlzdC9sZWFmbGV0LmZlYXR1cmVncm91cC5zdWJncm91cC5qcyI+PC9zY3JpcHQ+CjwvaGVhZD4KPGJvZHk+ICAgIAogICAgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvbGl1bS1tYXAiIGlkPSJtYXBfYmI2ZWJiMTQzY2MyNGMxMDlhYjQ4Njk0MThkMDhjN2EiID48L2Rpdj4KICAgICAgICAKPC9ib2R5Pgo8c2NyaXB0PiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFwX2JiNmViYjE0M2NjMjRjMTA5YWI0ODY5NDE4ZDA4YzdhID0gTC5tYXAoCiAgICAgICAgICAgICAgICAibWFwX2JiNmViYjE0M2NjMjRjMTA5YWI0ODY5NDE4ZDA4YzdhIiwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjZW50ZXI6IFswLjAsIDAuMF0sCiAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NywKICAgICAgICAgICAgICAgICAgICB6b29tOiA2LAogICAgICAgICAgICAgICAgICAgIHpvb21Db250cm9sOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHByZWZlckNhbnZhczogZmFsc2UsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICAKCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfOGRkNzI1MjVjNGZmNDUzZDhhMjQ3YzNlMmY4NzZjN2QgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICJodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZyIsCiAgICAgICAgICAgICAgICB7ImF0dHJpYnV0aW9uIjogIkRhdGEgYnkgXHUwMDI2Y29weTsgXHUwMDNjYSBocmVmPVwiaHR0cDovL29wZW5zdHJlZXRtYXAub3JnXCJcdTAwM2VPcGVuU3RyZWV0TWFwXHUwMDNjL2FcdTAwM2UsIHVuZGVyIFx1MDAzY2EgaHJlZj1cImh0dHA6Ly93d3cub3BlbnN0cmVldG1hcC5vcmcvY29weXJpZ2h0XCJcdTAwM2VPRGJMXHUwMDNjL2FcdTAwM2UuIiwgImRldGVjdFJldGluYSI6IGZhbHNlLCAibWF4TmF0aXZlWm9vbSI6IDE4LCAibWF4Wm9vbSI6IDE4LCAibWluWm9vbSI6IDAsICJub1dyYXAiOiBmYWxzZSwgIm9wYWNpdHkiOiAxLCAic3ViZG9tYWlucyI6ICJhYmMiLCAidG1zIjogZmFsc2V9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JiNmViYjE0M2NjMjRjMTA5YWI0ODY5NDE4ZDA4YzdhKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgZmVhdHVyZV9ncm91cF9jZTZmMDllOGVhNGU0MTY4ODQ1NDM3NTYzNDAyMGU0MSA9IEwuZmVhdHVyZUdyb3VwKAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmI2ZWJiMTQzY2MyNGMxMDlhYjQ4Njk0MThkMDhjN2EpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBmZWF0dXJlX2dyb3VwX3N1Yl9ncm91cF80MzZiNGQ0Mjk2ODY0ZGNlODdmZmVjZDRlOTljYTNhNCA9IEwuZmVhdHVyZUdyb3VwLnN1Ykdyb3VwKAogICAgICAgICAgICAgICAgZmVhdHVyZV9ncm91cF9jZTZmMDllOGVhNGU0MTY4ODQ1NDM3NTYzNDAyMGU0MQogICAgICAgICAgICApOwogICAgICAgICAgICBmZWF0dXJlX2dyb3VwX3N1Yl9ncm91cF80MzZiNGQ0Mjk2ODY0ZGNlODdmZmVjZDRlOTljYTNhNC5hZGRUbyhtYXBfYmI2ZWJiMTQzY2MyNGMxMDlhYjQ4Njk0MThkMDhjN2EpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjQwNjQxMDI4MTIwNGU3OGE0YTM5YjgxNzMzMTIxMDMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMS4wLCAtMS4wXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9zdWJfZ3JvdXBfNDM2YjRkNDI5Njg2NGRjZTg3ZmZlY2Q0ZTk5Y2EzYTQpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjMwZGE3ZTRhOTY4NDk5OGJiNzc5NTlkNTZlZDBlYzMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFsxLjAsIDEuMF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfc3ViX2dyb3VwXzQzNmI0ZDQyOTY4NjRkY2U4N2ZmZWNkNGU5OWNhM2E0KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgZmVhdHVyZV9ncm91cF9zdWJfZ3JvdXBfZmNhM2QwMzUxMzQ1NDdhODg4OTljODAyYzRmMmUyNWQgPSBMLmZlYXR1cmVHcm91cC5zdWJHcm91cCgKICAgICAgICAgICAgICAgIGZlYXR1cmVfZ3JvdXBfY2U2ZjA5ZThlYTRlNDE2ODg0NTQzNzU2MzQwMjBlNDEKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZmVhdHVyZV9ncm91cF9zdWJfZ3JvdXBfZmNhM2QwMzUxMzQ1NDdhODg4OTljODAyYzRmMmUyNWQuYWRkVG8obWFwX2JiNmViYjE0M2NjMjRjMTA5YWI0ODY5NDE4ZDA4YzdhKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2M4MDE0ZDRiMTU4NTQzMWU5ODA1MWZkNWQwODliZTJmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTEuMCwgMS4wXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9zdWJfZ3JvdXBfZmNhM2QwMzUxMzQ1NDdhODg4OTljODAyYzRmMmUyNWQpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMTE4MDEyY2ExMGU4NDc3MWI5NGU5NWFiMjJkZWJmOTUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFsxLjAsIC0xLjBdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX3N1Yl9ncm91cF9mY2EzZDAzNTEzNDU0N2E4ODg5OWM4MDJjNGYyZTI1ZCk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGxheWVyX2NvbnRyb2xfZDZmMDFlMjcwYWQ4NDRhZDgyYTkwYmU0YzU2ODA2ODEgPSB7CiAgICAgICAgICAgICAgICBiYXNlX2xheWVycyA6IHsKICAgICAgICAgICAgICAgICAgICAib3BlbnN0cmVldG1hcCIgOiB0aWxlX2xheWVyXzhkZDcyNTI1YzRmZjQ1M2Q4YTI0N2MzZTJmODc2YzdkLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIG92ZXJsYXlzIDogIHsKICAgICAgICAgICAgICAgICAgICAiZ3JvdXBzIiA6IGZlYXR1cmVfZ3JvdXBfY2U2ZjA5ZThlYTRlNDE2ODg0NTQzNzU2MzQwMjBlNDEsCiAgICAgICAgICAgICAgICAgICAgImdyb3VwMSIgOiBmZWF0dXJlX2dyb3VwX3N1Yl9ncm91cF80MzZiNGQ0Mjk2ODY0ZGNlODdmZmVjZDRlOTljYTNhNCwKICAgICAgICAgICAgICAgICAgICAiZ3JvdXAyIiA6IGZlYXR1cmVfZ3JvdXBfc3ViX2dyb3VwX2ZjYTNkMDM1MTM0NTQ3YTg4ODk5YzgwMmM0ZjJlMjVkLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgTC5jb250cm9sLmxheWVycygKICAgICAgICAgICAgICAgIGxheWVyX2NvbnRyb2xfZDZmMDFlMjcwYWQ4NDRhZDgyYTkwYmU0YzU2ODA2ODEuYmFzZV9sYXllcnMsCiAgICAgICAgICAgICAgICBsYXllcl9jb250cm9sX2Q2ZjAxZTI3MGFkODQ0YWQ4MmE5MGJlNGM1NjgwNjgxLm92ZXJsYXlzLAogICAgICAgICAgICAgICAgeyJhdXRvWkluZGV4IjogdHJ1ZSwgImNvbGxhcHNlZCI6IGZhbHNlLCAicG9zaXRpb24iOiAidG9wcmlnaHQifQogICAgICAgICAgICApLmFkZFRvKG1hcF9iYjZlYmIxNDNjYzI0YzEwOWFiNDg2OTQxOGQwOGM3YSk7CiAgICAgICAgCjwvc2NyaXB0Pg==\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
      ],
      "text/plain": [
       "<folium.folium.Map at 0x7f819c465e80>"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m = folium.Map(location=[0, 0], zoom_start=6)\n",
    "\n",
    "fg = folium.FeatureGroup(name='groups')\n",
    "m.add_child(fg)\n",
    "\n",
    "g1 = plugins.FeatureGroupSubGroup(fg, 'group1')\n",
    "m.add_child(g1)\n",
    "\n",
    "g2 = plugins.FeatureGroupSubGroup(fg, 'group2')\n",
    "m.add_child(g2)\n",
    "\n",
    "folium.Marker([-1, -1]).add_to(g1)\n",
    "folium.Marker([1, 1]).add_to(g1)\n",
    "\n",
    "folium.Marker([-1, 1]).add_to(g2)\n",
    "folium.Marker([1, -1]).add_to(g2)\n",
    "\n",
    "folium.LayerControl(collapsed=False).add_to(m)\n",
    "m.save(os.path.join('results', 'Plugins_8.html'))\n",
    "m"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Marker clusters across groups\n",
    "\n",
    "Create two subgroups, but cluster markers together."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgCiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgTF9OT19UT1VDSCA9IGZhbHNlOwogICAgICAgICAgICBMX0RJU0FCTEVfM0QgPSBmYWxzZTsKICAgICAgICA8L3NjcmlwdD4KICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjEyLjQubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2Nzcy9ib290c3RyYXAubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9mb250LWF3ZXNvbWUvNC42LjMvY3NzL2ZvbnQtYXdlc29tZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC4yL2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9weXRob24tdmlzdWFsaXphdGlvbi9mb2xpdW0vbWFzdGVyL2ZvbGl1bS90ZW1wbGF0ZXMvbGVhZmxldC5hd2Vzb21lLnJvdGF0ZS5jc3MiLz4KICAgIDxzdHlsZT5odG1sLCBib2R5IHt3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7bWFyZ2luOiAwO3BhZGRpbmc6IDA7fTwvc3R5bGU+CiAgICA8c3R5bGU+I21hcCB7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7cmlnaHQ6MDtsZWZ0OjA7fTwvc3R5bGU+CiAgICAKICAgICAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwKICAgICAgICAgICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgICAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAgICAgI21hcF83OTQzMGY5OWJmZWY0ZWMxOWY4ZGU3NmI5NGNjOWFhNiB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgbGVmdDogMC4wJTsKICAgICAgICAgICAgICAgICAgICB0b3A6IDAuMCU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIDwvc3R5bGU+CiAgICAgICAgCiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvbGVhZmxldC5tYXJrZXJjbHVzdGVyLzEuMS4wL2xlYWZsZXQubWFya2VyY2x1c3Rlci5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2xlYWZsZXQubWFya2VyY2x1c3Rlci8xLjEuMC9NYXJrZXJDbHVzdGVyLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9sZWFmbGV0Lm1hcmtlcmNsdXN0ZXIvMS4xLjAvTWFya2VyQ2x1c3Rlci5EZWZhdWx0LmNzcyIvPgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vdW5wa2cuY29tL2xlYWZsZXQuZmVhdHVyZWdyb3VwLnN1Ymdyb3VwQDEuMC4yL2Rpc3QvbGVhZmxldC5mZWF0dXJlZ3JvdXAuc3ViZ3JvdXAuanMiPjwvc2NyaXB0Pgo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzc5NDMwZjk5YmZlZjRlYzE5ZjhkZTc2Yjk0Y2M5YWE2IiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcF83OTQzMGY5OWJmZWY0ZWMxOWY4ZGU3NmI5NGNjOWFhNiA9IEwubWFwKAogICAgICAgICAgICAgICAgIm1hcF83OTQzMGY5OWJmZWY0ZWMxOWY4ZGU3NmI5NGNjOWFhNiIsCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2VudGVyOiBbMC4wLCAwLjBdLAogICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcsCiAgICAgICAgICAgICAgICAgICAgem9vbTogNiwKICAgICAgICAgICAgICAgICAgICB6b29tQ29udHJvbDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBwcmVmZXJDYW52YXM6IGZhbHNlLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwoKICAgICAgICAgICAgCgogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyXzY4MjBhZDNkNTk1NDQ0Mjg5NWNhZDJhYmI1YjkxZjU0ID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAiaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmciLAogICAgICAgICAgICAgICAgeyJhdHRyaWJ1dGlvbiI6ICJEYXRhIGJ5IFx1MDAyNmNvcHk7IFx1MDAzY2EgaHJlZj1cImh0dHA6Ly9vcGVuc3RyZWV0bWFwLm9yZ1wiXHUwMDNlT3BlblN0cmVldE1hcFx1MDAzYy9hXHUwMDNlLCB1bmRlciBcdTAwM2NhIGhyZWY9XCJodHRwOi8vd3d3Lm9wZW5zdHJlZXRtYXAub3JnL2NvcHlyaWdodFwiXHUwMDNlT0RiTFx1MDAzYy9hXHUwMDNlLiIsICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwgIm1heE5hdGl2ZVpvb20iOiAxOCwgIm1heFpvb20iOiAxOCwgIm1pblpvb20iOiAwLCAibm9XcmFwIjogZmFsc2UsICJvcGFjaXR5IjogMSwgInN1YmRvbWFpbnMiOiAiYWJjIiwgInRtcyI6IGZhbHNlfQogICAgICAgICAgICApLmFkZFRvKG1hcF83OTQzMGY5OWJmZWY0ZWMxOWY4ZGU3NmI5NGNjOWFhNik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9jbHVzdGVyXzEwOWE5NWIyNmNkMTQwMDE4YmE5MmRjNTk4ZDJjOTkwID0gTC5tYXJrZXJDbHVzdGVyR3JvdXAoCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXBfNzk0MzBmOTliZmVmNGVjMTlmOGRlNzZiOTRjYzlhYTYuYWRkTGF5ZXIobWFya2VyX2NsdXN0ZXJfMTA5YTk1YjI2Y2QxNDAwMThiYTkyZGM1OThkMmM5OTApOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBmZWF0dXJlX2dyb3VwX3N1Yl9ncm91cF80N2ExNDc4NGEwMWU0Nzk1OTc0YTA5NzYzMzY5MWIyMCA9IEwuZmVhdHVyZUdyb3VwLnN1Ykdyb3VwKAogICAgICAgICAgICAgICAgbWFya2VyX2NsdXN0ZXJfMTA5YTk1YjI2Y2QxNDAwMThiYTkyZGM1OThkMmM5OTAKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZmVhdHVyZV9ncm91cF9zdWJfZ3JvdXBfNDdhMTQ3ODRhMDFlNDc5NTk3NGEwOTc2MzM2OTFiMjAuYWRkVG8obWFwXzc5NDMwZjk5YmZlZjRlYzE5ZjhkZTc2Yjk0Y2M5YWE2KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2RiMWNhN2I5ZWJkMjQwMWZiZjg0NjBmMGY4NTEzZWQ5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTEuMCwgLTEuMF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfc3ViX2dyb3VwXzQ3YTE0Nzg0YTAxZTQ3OTU5NzRhMDk3NjMzNjkxYjIwKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzkwZGUzYWNjYmFlZjRiYTNiZmQ2NDhjMGQxMTRhN2RkID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMS4wLCAxLjBdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX3N1Yl9ncm91cF80N2ExNDc4NGEwMWU0Nzk1OTc0YTA5NzYzMzY5MWIyMCk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGZlYXR1cmVfZ3JvdXBfc3ViX2dyb3VwX2U5OTQ1YWJmMTUyYTRiOWY4YmQ1MDBkNDdiOTFjOWM0ID0gTC5mZWF0dXJlR3JvdXAuc3ViR3JvdXAoCiAgICAgICAgICAgICAgICBtYXJrZXJfY2x1c3Rlcl8xMDlhOTViMjZjZDE0MDAxOGJhOTJkYzU5OGQyYzk5MAogICAgICAgICAgICApOwogICAgICAgICAgICBmZWF0dXJlX2dyb3VwX3N1Yl9ncm91cF9lOTk0NWFiZjE1MmE0YjlmOGJkNTAwZDQ3YjkxYzljNC5hZGRUbyhtYXBfNzk0MzBmOTliZmVmNGVjMTlmOGRlNzZiOTRjYzlhYTYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDBiMWIzM2ZiMjM4NGNkNjk4ZDJiYzc5ZmEwNzUwMzQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMS4wLCAxLjBdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX3N1Yl9ncm91cF9lOTk0NWFiZjE1MmE0YjlmOGJkNTAwZDQ3YjkxYzljNCk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl80MWY1ZTI4M2U4YWU0MTRjYjQzZWZlMWFkM2IyNDUyMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzEuMCwgLTEuMF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfc3ViX2dyb3VwX2U5OTQ1YWJmMTUyYTRiOWY4YmQ1MDBkNDdiOTFjOWM0KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbGF5ZXJfY29udHJvbF84NTIwZGFkZjJjNjc0YTQ2YjA1ZTMzYmNhOWYxMzhiYiA9IHsKICAgICAgICAgICAgICAgIGJhc2VfbGF5ZXJzIDogewogICAgICAgICAgICAgICAgICAgICJvcGVuc3RyZWV0bWFwIiA6IHRpbGVfbGF5ZXJfNjgyMGFkM2Q1OTU0NDQyODk1Y2FkMmFiYjViOTFmNTQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgb3ZlcmxheXMgOiAgewogICAgICAgICAgICAgICAgICAgICJncm91cDEiIDogZmVhdHVyZV9ncm91cF9zdWJfZ3JvdXBfNDdhMTQ3ODRhMDFlNDc5NTk3NGEwOTc2MzM2OTFiMjAsCiAgICAgICAgICAgICAgICAgICAgImdyb3VwMiIgOiBmZWF0dXJlX2dyb3VwX3N1Yl9ncm91cF9lOTk0NWFiZjE1MmE0YjlmOGJkNTAwZDQ3YjkxYzljNCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIEwuY29udHJvbC5sYXllcnMoCiAgICAgICAgICAgICAgICBsYXllcl9jb250cm9sXzg1MjBkYWRmMmM2NzRhNDZiMDVlMzNiY2E5ZjEzOGJiLmJhc2VfbGF5ZXJzLAogICAgICAgICAgICAgICAgbGF5ZXJfY29udHJvbF84NTIwZGFkZjJjNjc0YTQ2YjA1ZTMzYmNhOWYxMzhiYi5vdmVybGF5cywKICAgICAgICAgICAgICAgIHsiYXV0b1pJbmRleCI6IHRydWUsICJjb2xsYXBzZWQiOiBmYWxzZSwgInBvc2l0aW9uIjogInRvcHJpZ2h0In0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzk0MzBmOTliZmVmNGVjMTlmOGRlNzZiOTRjYzlhYTYpOwogICAgICAgIAo8L3NjcmlwdD4=\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
      ],
      "text/plain": [
       "<folium.folium.Map at 0x7f819c418b70>"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m = folium.Map(location=[0, 0], zoom_start=6)\n",
    "\n",
    "mcg = folium.plugins.MarkerCluster(control=False)\n",
    "m.add_child(mcg)\n",
    "\n",
    "g1 = folium.plugins.FeatureGroupSubGroup(mcg, 'group1')\n",
    "m.add_child(g1)\n",
    "\n",
    "g2 = folium.plugins.FeatureGroupSubGroup(mcg, 'group2')\n",
    "m.add_child(g2)\n",
    "\n",
    "folium.Marker([-1, -1]).add_to(g1)\n",
    "folium.Marker([1, 1]).add_to(g1)\n",
    "\n",
    "folium.Marker([-1, 1]).add_to(g2)\n",
    "folium.Marker([1, -1]).add_to(g2)\n",
    "\n",
    "folium.LayerControl(collapsed=False).add_to(m)\n",
    "m.save(os.path.join('results', 'Plugins_9.html'))\n",
    "m"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Minimap\n",
    "\n",
    "Adds a locator minimap to a folium document."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgCiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgTF9OT19UT1VDSCA9IGZhbHNlOwogICAgICAgICAgICBMX0RJU0FCTEVfM0QgPSBmYWxzZTsKICAgICAgICA8L3NjcmlwdD4KICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjEyLjQubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2Nzcy9ib290c3RyYXAubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9mb250LWF3ZXNvbWUvNC42LjMvY3NzL2ZvbnQtYXdlc29tZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC4yL2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9weXRob24tdmlzdWFsaXphdGlvbi9mb2xpdW0vbWFzdGVyL2ZvbGl1bS90ZW1wbGF0ZXMvbGVhZmxldC5hd2Vzb21lLnJvdGF0ZS5jc3MiLz4KICAgIDxzdHlsZT5odG1sLCBib2R5IHt3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7bWFyZ2luOiAwO3BhZGRpbmc6IDA7fTwvc3R5bGU+CiAgICA8c3R5bGU+I21hcCB7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7cmlnaHQ6MDtsZWZ0OjA7fTwvc3R5bGU+CiAgICAKICAgICAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwKICAgICAgICAgICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgICAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAgICAgI21hcF8xNWFhNWMyN2Q1NDQ0OTFhYjYxMjIxN2E0M2VhZDY3MiB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgbGVmdDogMC4wJTsKICAgICAgICAgICAgICAgICAgICB0b3A6IDAuMCU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIDwvc3R5bGU+CiAgICAgICAgCiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvbGVhZmxldC1taW5pbWFwLzMuNi4xL0NvbnRyb2wuTWluaU1hcC5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2xlYWZsZXQtbWluaW1hcC8zLjYuMS9Db250cm9sLk1pbmlNYXAuY3NzIi8+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvbGVhZmxldC1taW5pbWFwLzMuNi4xL0NvbnRyb2wuTWluaU1hcC5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2xlYWZsZXQtbWluaW1hcC8zLjYuMS9Db250cm9sLk1pbmlNYXAuY3NzIi8+CjwvaGVhZD4KPGJvZHk+ICAgIAogICAgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvbGl1bS1tYXAiIGlkPSJtYXBfMTVhYTVjMjdkNTQ0NDkxYWI2MTIyMTdhNDNlYWQ2NzIiID48L2Rpdj4KICAgICAgICAKPC9ib2R5Pgo8c2NyaXB0PiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFwXzE1YWE1YzI3ZDU0NDQ5MWFiNjEyMjE3YTQzZWFkNjcyID0gTC5tYXAoCiAgICAgICAgICAgICAgICAibWFwXzE1YWE1YzI3ZDU0NDQ5MWFiNjEyMjE3YTQzZWFkNjcyIiwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjZW50ZXI6IFszMC4wLCAyMC4wXSwKICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3LAogICAgICAgICAgICAgICAgICAgIHpvb206IDQsCiAgICAgICAgICAgICAgICAgICAgem9vbUNvbnRyb2w6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgcHJlZmVyQ2FudmFzOiBmYWxzZSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIAoKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl85MGQ2Zjg2YjhhZjQ0MzMyYjAyYzhiZTIzYmU4YjJiOCA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgImh0dHBzOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nIiwKICAgICAgICAgICAgICAgIHsiYXR0cmlidXRpb24iOiAiRGF0YSBieSBcdTAwMjZjb3B5OyBcdTAwM2NhIGhyZWY9XCJodHRwOi8vb3BlbnN0cmVldG1hcC5vcmdcIlx1MDAzZU9wZW5TdHJlZXRNYXBcdTAwM2MvYVx1MDAzZSwgdW5kZXIgXHUwMDNjYSBocmVmPVwiaHR0cDovL3d3dy5vcGVuc3RyZWV0bWFwLm9yZy9jb3B5cmlnaHRcIlx1MDAzZU9EYkxcdTAwM2MvYVx1MDAzZS4iLCAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsICJtYXhOYXRpdmVab29tIjogMTgsICJtYXhab29tIjogMTgsICJtaW5ab29tIjogMCwgIm5vV3JhcCI6IGZhbHNlLCAib3BhY2l0eSI6IDEsICJzdWJkb21haW5zIjogImFiYyIsICJ0bXMiOiBmYWxzZX0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTVhYTVjMjdkNTQ0NDkxYWI2MTIyMTdhNDNlYWQ2NzIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyXzdhYzE4Yjk5NzhkZjQ0NWNiNTljODJkZDgzZTc4ZmI3ID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAiaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmciLAogICAgICAgICAgICAgICAgeyJhdHRyaWJ1dGlvbiI6ICJEYXRhIGJ5IFx1MDAyNmNvcHk7IFx1MDAzY2EgaHJlZj1cImh0dHA6Ly9vcGVuc3RyZWV0bWFwLm9yZ1wiXHUwMDNlT3BlblN0cmVldE1hcFx1MDAzYy9hXHUwMDNlLCB1bmRlciBcdTAwM2NhIGhyZWY9XCJodHRwOi8vd3d3Lm9wZW5zdHJlZXRtYXAub3JnL2NvcHlyaWdodFwiXHUwMDNlT0RiTFx1MDAzYy9hXHUwMDNlLiIsICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwgIm1heE5hdGl2ZVpvb20iOiAxOCwgIm1heFpvb20iOiAxOCwgIm1pblpvb20iOiAwLCAibm9XcmFwIjogZmFsc2UsICJvcGFjaXR5IjogMSwgInN1YmRvbWFpbnMiOiAiYWJjIiwgInRtcyI6IGZhbHNlfQogICAgICAgICAgICApOwogICAgICAgICAgICB2YXIgbWluaV9tYXBfZDZlYTEyOTBmNzQ2NDMzMzg2MGQ1MDk4MmFkMDJhNjYgPSBuZXcgTC5Db250cm9sLk1pbmlNYXAoCiAgICAgICAgICAgICAgICB0aWxlX2xheWVyXzdhYzE4Yjk5NzhkZjQ0NWNiNTljODJkZDgzZTc4ZmI3LAogICAgICAgICAgICAgICAgeyJhdXRvVG9nZ2xlRGlzcGxheSI6IGZhbHNlLCAiY2VudGVyRml4ZWQiOiBmYWxzZSwgImNvbGxhcHNlZEhlaWdodCI6IDI1LCAiY29sbGFwc2VkV2lkdGgiOiAyNSwgImhlaWdodCI6IDE1MCwgIm1pbmltaXplZCI6IGZhbHNlLCAicG9zaXRpb24iOiAiYm90dG9tcmlnaHQiLCAidG9nZ2xlRGlzcGxheSI6IGZhbHNlLCAid2lkdGgiOiAxNTAsICJ6b29tQW5pbWF0aW9uIjogZmFsc2UsICJ6b29tTGV2ZWxPZmZzZXQiOiAtNX0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFwXzE1YWE1YzI3ZDU0NDQ5MWFiNjEyMjE3YTQzZWFkNjcyLmFkZENvbnRyb2wobWluaV9tYXBfZDZlYTEyOTBmNzQ2NDMzMzg2MGQ1MDk4MmFkMDJhNjYpOwogICAgICAgIAo8L3NjcmlwdD4=\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
      ],
      "text/plain": [
       "<folium.folium.Map at 0x7f819c467208>"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m = folium.Map(location=(30, 20), zoom_start=4)\n",
    "\n",
    "minimap = plugins.MiniMap()\n",
    "m.add_child(minimap)\n",
    "\n",
    "m.save(os.path.join('results', 'Plugins_10.html'))\n",
    "m"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## DualMap\n",
    "The DualMap plugin can be used to display two maps side by side, where panning and zooming is syncronized.\n",
    "\n",
    "The `DualMap` class can be used just like the normal `Map` class. The two sub-maps can be accessed with its `m1` and `m2` attributes."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgCiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgTF9OT19UT1VDSCA9IGZhbHNlOwogICAgICAgICAgICBMX0RJU0FCTEVfM0QgPSBmYWxzZTsKICAgICAgICA8L3NjcmlwdD4KICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjEyLjQubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2Nzcy9ib290c3RyYXAubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9mb250LWF3ZXNvbWUvNC42LjMvY3NzL2ZvbnQtYXdlc29tZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC4yL2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9weXRob24tdmlzdWFsaXphdGlvbi9mb2xpdW0vbWFzdGVyL2ZvbGl1bS90ZW1wbGF0ZXMvbGVhZmxldC5hd2Vzb21lLnJvdGF0ZS5jc3MiLz4KICAgIDxzdHlsZT5odG1sLCBib2R5IHt3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7bWFyZ2luOiAwO3BhZGRpbmc6IDA7fTwvc3R5bGU+CiAgICA8c3R5bGU+I21hcCB7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7cmlnaHQ6MDtsZWZ0OjA7fTwvc3R5bGU+CiAgICAKICAgICAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwKICAgICAgICAgICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgICAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAgICAgI21hcF8yMGVmYjhlZTgzNGU0ODA0OWY5MzQ1NTZjYmI2MjE4YyB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgICAgICAgICAgIHdpZHRoOiA1MC4wJTsKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDEwMC4wJTsKICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgICAgIHRvcDogMC4wJTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgPC9zdHlsZT4KICAgICAgICAKICAgIAogICAgICAgICAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLAogICAgICAgICAgICAgICAgaW5pdGlhbC1zY2FsZT0xLjAsIG1heGltdW0tc2NhbGU9MS4wLCB1c2VyLXNjYWxhYmxlPW5vIiAvPgogICAgICAgICAgICA8c3R5bGU+CiAgICAgICAgICAgICAgICAjbWFwXzQyN2E1ZjY2ZWYzNzQ0ODA4NmMyOTdhMmJmZmNhMDhkIHsKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDUwLjAlOwogICAgICAgICAgICAgICAgICAgIGhlaWdodDogMTAwLjAlOwogICAgICAgICAgICAgICAgICAgIGxlZnQ6IDUwLjAlOwogICAgICAgICAgICAgICAgICAgIHRvcDogMC4wJTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgPC9zdHlsZT4KICAgICAgICAKICAgIDxzY3JpcHQgc3JjPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9qaWV0ZXIvTGVhZmxldC5TeW5jL21hc3Rlci9MLk1hcC5TeW5jLmpzIj48L3NjcmlwdD4KPC9oZWFkPgo8Ym9keT4gICAgCiAgICAKICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9saXVtLW1hcCIgaWQ9Im1hcF8yMGVmYjhlZTgzNGU0ODA0OWY5MzQ1NTZjYmI2MjE4YyIgPjwvZGl2PgogICAgICAgIAogICAgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvbGl1bS1tYXAiIGlkPSJtYXBfNDI3YTVmNjZlZjM3NDQ4MDg2YzI5N2EyYmZmY2EwOGQiID48L2Rpdj4KICAgICAgICAKPC9ib2R5Pgo8c2NyaXB0PiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFwXzIwZWZiOGVlODM0ZTQ4MDQ5ZjkzNDU1NmNiYjYyMThjID0gTC5tYXAoCiAgICAgICAgICAgICAgICAibWFwXzIwZWZiOGVlODM0ZTQ4MDQ5ZjkzNDU1NmNiYjYyMThjIiwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjZW50ZXI6IFs1Mi4xLCA1LjFdLAogICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcsCiAgICAgICAgICAgICAgICAgICAgem9vbTogOCwKICAgICAgICAgICAgICAgICAgICB6b29tQ29udHJvbDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBwcmVmZXJDYW52YXM6IGZhbHNlLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwoKICAgICAgICAgICAgCgogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyX2Q4NDIxYzYxMWFjZDQxNTBiNTI0ZGFjMDg4M2E5NDdkID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAiaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmciLAogICAgICAgICAgICAgICAgeyJhdHRyaWJ1dGlvbiI6ICJEYXRhIGJ5IFx1MDAyNmNvcHk7IFx1MDAzY2EgaHJlZj1cImh0dHA6Ly9vcGVuc3RyZWV0bWFwLm9yZ1wiXHUwMDNlT3BlblN0cmVldE1hcFx1MDAzYy9hXHUwMDNlLCB1bmRlciBcdTAwM2NhIGhyZWY9XCJodHRwOi8vd3d3Lm9wZW5zdHJlZXRtYXAub3JnL2NvcHlyaWdodFwiXHUwMDNlT0RiTFx1MDAzYy9hXHUwMDNlLiIsICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwgIm1heE5hdGl2ZVpvb20iOiAxOCwgIm1heFpvb20iOiAxOCwgIm1pblpvb20iOiAwLCAibm9XcmFwIjogZmFsc2UsICJvcGFjaXR5IjogMSwgInN1YmRvbWFpbnMiOiAiYWJjIiwgInRtcyI6IGZhbHNlfQogICAgICAgICAgICApLmFkZFRvKG1hcF8yMGVmYjhlZTgzNGU0ODA0OWY5MzQ1NTZjYmI2MjE4Yyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGZlYXR1cmVfZ3JvdXBfMDdkODgwMWI2ZThhNDVlYWI1ZjFiMzg3YTY5YTA1YjkgPSBMLmZlYXR1cmVHcm91cCgKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzIwZWZiOGVlODM0ZTQ4MDQ5ZjkzNDU1NmNiYjYyMThjKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2U3MmMxNjFkNzg0MjQ2M2RiNmFiNzQzZTFmNmQ0NzU4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTIuMCwgNS4wXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF8wN2Q4ODAxYjZlOGE0NWVhYjVmMWIzODdhNjlhMDViOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGljb25fMzk0NjFjNTgzMjYzNDVlNWFlMDMwYTE0NTM3YzA1MDkgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oCiAgICAgICAgICAgICAgICB7ImV4dHJhQ2xhc3NlcyI6ICJmYS1yb3RhdGUtMCIsICJpY29uIjogImluZm8tc2lnbiIsICJpY29uQ29sb3IiOiAid2hpdGUiLCAibWFya2VyQ29sb3IiOiAicmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfZTcyYzE2MWQ3ODQyNDYzZGI2YWI3NDNlMWY2ZDQ3NTguc2V0SWNvbihpY29uXzM5NDYxYzU4MzI2MzQ1ZTVhZTAzMGExNDUzN2MwNTA5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBtYXJrZXJfZTcyYzE2MWQ3ODQyNDYzZGI2YWI3NDNlMWY2ZDQ3NTguYmluZFRvb2x0aXAoCiAgICAgICAgICAgICAgICBgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgYm90aAogICAgICAgICAgICAgICAgIDwvZGl2PmAsCiAgICAgICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgICAgICk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGZlYXR1cmVfZ3JvdXBfNWZiZTJhODllNTBiNGZkZjk2MjZlYmMxZDM0OTdkN2QgPSBMLmZlYXR1cmVHcm91cCgKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzIwZWZiOGVlODM0ZTQ4MDQ5ZjkzNDU1NmNiYjYyMThjKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzQ3YWNmZjk1NDBjMDRiZTM4Yjk0ODlhMTMyZTAwNGU2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTIuNCwgNS4wXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81ZmJlMmE4OWU1MGI0ZmRmOTYyNmViYzFkMzQ5N2Q3ZCk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgbWFya2VyXzQ3YWNmZjk1NDBjMDRiZTM4Yjk0ODlhMTMyZTAwNGU2LmJpbmRUb29sdGlwKAogICAgICAgICAgICAgICAgYDxkaXY+CiAgICAgICAgICAgICAgICAgICAgIGxlZnQKICAgICAgICAgICAgICAgICA8L2Rpdj5gLAogICAgICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICAgICApOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBsYXllcl9jb250cm9sX2QzNzFjZjE2NDhiYzQwNDQ4ZGE0OTVjY2E2ZjA4Y2IwID0gewogICAgICAgICAgICAgICAgYmFzZV9sYXllcnMgOiB7CiAgICAgICAgICAgICAgICAgICAgIm9wZW5zdHJlZXRtYXAiIDogdGlsZV9sYXllcl9kODQyMWM2MTFhY2Q0MTUwYjUyNGRhYzA4ODNhOTQ3ZCwKICAgICAgICAgICAgICAgICAgICAiY2FydG9kYnBvc2l0cm9uIiA6IHRpbGVfbGF5ZXJfMDRiZmE1ZDMzZTU4NGRmZjlhZDVlYzgyOWY3YWFmYWIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgb3ZlcmxheXMgOiAgewogICAgICAgICAgICAgICAgICAgICJtYXJrZXJzX2JvdGgiIDogZmVhdHVyZV9ncm91cF8wN2Q4ODAxYjZlOGE0NWVhYjVmMWIzODdhNjlhMDViOSwKICAgICAgICAgICAgICAgICAgICAibWFya2Vyc18xIiA6IGZlYXR1cmVfZ3JvdXBfNWZiZTJhODllNTBiNGZkZjk2MjZlYmMxZDM0OTdkN2QsCiAgICAgICAgICAgICAgICAgICAgIm1hcmtlcnNfMiIgOiBmZWF0dXJlX2dyb3VwX2NiYTUzYzk4YjYwOTQzZjZiOWQ3OTU5MmE3NTVkYjhmLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgTC5jb250cm9sLmxheWVycygKICAgICAgICAgICAgICAgIGxheWVyX2NvbnRyb2xfZDM3MWNmMTY0OGJjNDA0NDhkYTQ5NWNjYTZmMDhjYjAuYmFzZV9sYXllcnMsCiAgICAgICAgICAgICAgICBsYXllcl9jb250cm9sX2QzNzFjZjE2NDhiYzQwNDQ4ZGE0OTVjY2E2ZjA4Y2IwLm92ZXJsYXlzLAogICAgICAgICAgICAgICAgeyJhdXRvWkluZGV4IjogdHJ1ZSwgImNvbGxhcHNlZCI6IGZhbHNlLCAicG9zaXRpb24iOiAidG9wcmlnaHQifQogICAgICAgICAgICApLmFkZFRvKG1hcF8yMGVmYjhlZTgzNGU0ODA0OWY5MzQ1NTZjYmI2MjE4Yyk7CiAgICAgICAgICAgIHRpbGVfbGF5ZXJfMDRiZmE1ZDMzZTU4NGRmZjlhZDVlYzgyOWY3YWFmYWIucmVtb3ZlKCk7CiAgICAgICAgICAgIHRpbGVfbGF5ZXJfZDg0MjFjNjExYWNkNDE1MGI1MjRkYWMwODgzYTk0N2QucmVtb3ZlKCk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcF80MjdhNWY2NmVmMzc0NDgwODZjMjk3YTJiZmZjYTA4ZCA9IEwubWFwKAogICAgICAgICAgICAgICAgIm1hcF80MjdhNWY2NmVmMzc0NDgwODZjMjk3YTJiZmZjYTA4ZCIsCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2VudGVyOiBbNTIuMSwgNS4xXSwKICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3LAogICAgICAgICAgICAgICAgICAgIHpvb206IDgsCiAgICAgICAgICAgICAgICAgICAgem9vbUNvbnRyb2w6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgcHJlZmVyQ2FudmFzOiBmYWxzZSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIAoKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl8wNGJmYTVkMzNlNTg0ZGZmOWFkNWVjODI5ZjdhYWZhYiA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgImh0dHBzOi8vY2FydG9kYi1iYXNlbWFwcy17c30uZ2xvYmFsLnNzbC5mYXN0bHkubmV0L2xpZ2h0X2FsbC97en0ve3h9L3t5fS5wbmciLAogICAgICAgICAgICAgICAgeyJhdHRyaWJ1dGlvbiI6ICJcdTAwMjZjb3B5OyBcdTAwM2NhIGhyZWY9XCJodHRwOi8vd3d3Lm9wZW5zdHJlZXRtYXAub3JnL2NvcHlyaWdodFwiXHUwMDNlT3BlblN0cmVldE1hcFx1MDAzYy9hXHUwMDNlIGNvbnRyaWJ1dG9ycyBcdTAwMjZjb3B5OyBcdTAwM2NhIGhyZWY9XCJodHRwOi8vY2FydG9kYi5jb20vYXR0cmlidXRpb25zXCJcdTAwM2VDYXJ0b0RCXHUwMDNjL2FcdTAwM2UsIENhcnRvREIgXHUwMDNjYSBocmVmID1cImh0dHA6Ly9jYXJ0b2RiLmNvbS9hdHRyaWJ1dGlvbnNcIlx1MDAzZWF0dHJpYnV0aW9uc1x1MDAzYy9hXHUwMDNlIiwgImRldGVjdFJldGluYSI6IGZhbHNlLCAibWF4TmF0aXZlWm9vbSI6IDE4LCAibWF4Wm9vbSI6IDE4LCAibWluWm9vbSI6IDAsICJub1dyYXAiOiBmYWxzZSwgIm9wYWNpdHkiOiAxLCAic3ViZG9tYWlucyI6ICJhYmMiLCAidG1zIjogZmFsc2V9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQyN2E1ZjY2ZWYzNzQ0ODA4NmMyOTdhMmJmZmNhMDhkKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgZmVhdHVyZV9ncm91cF9jYmE1M2M5OGI2MDk0M2Y2YjlkNzk1OTJhNzU1ZGI4ZiA9IEwuZmVhdHVyZUdyb3VwKAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDI3YTVmNjZlZjM3NDQ4MDg2YzI5N2EyYmZmY2EwOGQpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMWFhNDAzY2Y5ZDFlNGQ1ZTllMTRjYTQ0YTYzZWY4MzQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1Mi4wLCA1LjRdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2NiYTUzYzk4YjYwOTQzZjZiOWQ3OTU5MmE3NTVkYjhmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICBtYXJrZXJfMWFhNDAzY2Y5ZDFlNGQ1ZTllMTRjYTQ0YTYzZWY4MzQuYmluZFRvb2x0aXAoCiAgICAgICAgICAgICAgICBgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgcmlnaHQKICAgICAgICAgICAgICAgICA8L2Rpdj5gLAogICAgICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICAgICApOwogICAgICAgIAogICAgCiAgICAgICAgICAgIG1hcF8yMGVmYjhlZTgzNGU0ODA0OWY5MzQ1NTZjYmI2MjE4Yy5zeW5jKG1hcF80MjdhNWY2NmVmMzc0NDgwODZjMjk3YTJiZmZjYTA4ZCk7CiAgICAgICAgICAgIG1hcF80MjdhNWY2NmVmMzc0NDgwODZjMjk3YTJiZmZjYTA4ZC5zeW5jKG1hcF8yMGVmYjhlZTgzNGU0ODA0OWY5MzQ1NTZjYmI2MjE4Yyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfZmIwZDY4OGNkNjNiNDAwMGEzZTgyM2Q3ZjNjOTljYWEgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICJodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZyIsCiAgICAgICAgICAgICAgICB7ImF0dHJpYnV0aW9uIjogIkRhdGEgYnkgXHUwMDI2Y29weTsgXHUwMDNjYSBocmVmPVwiaHR0cDovL29wZW5zdHJlZXRtYXAub3JnXCJcdTAwM2VPcGVuU3RyZWV0TWFwXHUwMDNjL2FcdTAwM2UsIHVuZGVyIFx1MDAzY2EgaHJlZj1cImh0dHA6Ly93d3cub3BlbnN0cmVldG1hcC5vcmcvY29weXJpZ2h0XCJcdTAwM2VPRGJMXHUwMDNjL2FcdTAwM2UuIiwgImRldGVjdFJldGluYSI6IGZhbHNlLCAibWF4TmF0aXZlWm9vbSI6IDE4LCAibWF4Wm9vbSI6IDE4LCAibWluWm9vbSI6IDAsICJub1dyYXAiOiBmYWxzZSwgIm9wYWNpdHkiOiAxLCAic3ViZG9tYWlucyI6ICJhYmMiLCAidG1zIjogZmFsc2V9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQyN2E1ZjY2ZWYzNzQ0ODA4NmMyOTdhMmJmZmNhMDhkKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgZmVhdHVyZV9ncm91cF82Nzg4OWI0NzBhMzc0ZjIzOWVmMDI4M2Y4YjgxMDAzNyA9IEwuZmVhdHVyZUdyb3VwKAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDI3YTVmNjZlZjM3NDQ4MDg2YzI5N2EyYmZmY2EwOGQpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYmQ3MDYzMWFlYjE3NDc4NWFkYmM5ZGNjZDU1NDliYWMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1Mi4wLCA1LjBdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzY3ODg5YjQ3MGEzNzRmMjM5ZWYwMjgzZjhiODEwMDM3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl8wZWUwYjc5OGRjMTk0ODNlYmFmNWQyM2Y0MjBhZDBhZiA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiaW5mby1zaWduIiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJyZWQiLCAicHJlZml4IjogImdseXBoaWNvbiJ9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG1hcmtlcl9iZDcwNjMxYWViMTc0Nzg1YWRiYzlkY2NkNTU0OWJhYy5zZXRJY29uKGljb25fMGVlMGI3OThkYzE5NDgzZWJhZjVkMjNmNDIwYWQwYWYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIG1hcmtlcl9iZDcwNjMxYWViMTc0Nzg1YWRiYzlkY2NkNTU0OWJhYy5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgICAgIGA8ZGl2PgogICAgICAgICAgICAgICAgICAgICBib3RoCiAgICAgICAgICAgICAgICAgPC9kaXY+YCwKICAgICAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICAgICAgKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbGF5ZXJfY29udHJvbF8wMDM3OWMyY2JkN2I0ZmY5YTQ2YWE0MDUwZGQyN2NhMyA9IHsKICAgICAgICAgICAgICAgIGJhc2VfbGF5ZXJzIDogewogICAgICAgICAgICAgICAgICAgICJvcGVuc3RyZWV0bWFwIiA6IHRpbGVfbGF5ZXJfZmIwZDY4OGNkNjNiNDAwMGEzZTgyM2Q3ZjNjOTljYWEsCiAgICAgICAgICAgICAgICAgICAgImNhcnRvZGJwb3NpdHJvbiIgOiB0aWxlX2xheWVyXzA0YmZhNWQzM2U1ODRkZmY5YWQ1ZWM4MjlmN2FhZmFiLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIG92ZXJsYXlzIDogIHsKICAgICAgICAgICAgICAgICAgICAibWFya2Vyc19ib3RoIiA6IGZlYXR1cmVfZ3JvdXBfNjc4ODliNDcwYTM3NGYyMzllZjAyODNmOGI4MTAwMzcsCiAgICAgICAgICAgICAgICAgICAgIm1hcmtlcnNfMSIgOiBmZWF0dXJlX2dyb3VwXzVmYmUyYTg5ZTUwYjRmZGY5NjI2ZWJjMWQzNDk3ZDdkLAogICAgICAgICAgICAgICAgICAgICJtYXJrZXJzXzIiIDogZmVhdHVyZV9ncm91cF9jYmE1M2M5OGI2MDk0M2Y2YjlkNzk1OTJhNzU1ZGI4ZiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIEwuY29udHJvbC5sYXllcnMoCiAgICAgICAgICAgICAgICBsYXllcl9jb250cm9sXzAwMzc5YzJjYmQ3YjRmZjlhNDZhYTQwNTBkZDI3Y2EzLmJhc2VfbGF5ZXJzLAogICAgICAgICAgICAgICAgbGF5ZXJfY29udHJvbF8wMDM3OWMyY2JkN2I0ZmY5YTQ2YWE0MDUwZGQyN2NhMy5vdmVybGF5cywKICAgICAgICAgICAgICAgIHsiYXV0b1pJbmRleCI6IHRydWUsICJjb2xsYXBzZWQiOiBmYWxzZSwgInBvc2l0aW9uIjogInRvcHJpZ2h0In0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDI3YTVmNjZlZjM3NDQ4MDg2YzI5N2EyYmZmY2EwOGQpOwogICAgICAgICAgICB0aWxlX2xheWVyXzA0YmZhNWQzM2U1ODRkZmY5YWQ1ZWM4MjlmN2FhZmFiLnJlbW92ZSgpOwogICAgICAgICAgICB0aWxlX2xheWVyX2ZiMGQ2ODhjZDYzYjQwMDBhM2U4MjNkN2YzYzk5Y2FhLnJlbW92ZSgpOwogICAgICAgIAo8L3NjcmlwdD4=\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
      ],
      "text/plain": [
       "<folium.plugins.dual_map.DualMap at 0x7f819c3d4c50>"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m = plugins.DualMap(location=(52.1, 5.1), tiles=None, zoom_start=8)\n",
    "\n",
    "folium.TileLayer('cartodbpositron').add_to(m.m2)\n",
    "folium.TileLayer('openstreetmap').add_to(m)\n",
    "\n",
    "fg_both = folium.FeatureGroup(name='markers_both').add_to(m)\n",
    "fg_1 = folium.FeatureGroup(name='markers_1').add_to(m.m1)\n",
    "fg_2 = folium.FeatureGroup(name='markers_2').add_to(m.m2)\n",
    "\n",
    "icon_red = folium.Icon(color='red')\n",
    "folium.Marker((52, 5), tooltip='both', icon=icon_red).add_to(fg_both)\n",
    "folium.Marker((52.4, 5), tooltip='left').add_to(fg_1)\n",
    "folium.Marker((52, 5.4), tooltip='right').add_to(fg_2)\n",
    "\n",
    "folium.LayerControl(collapsed=False).add_to(m)\n",
    "m.save(os.path.join('results', 'Plugins_11.html'))\n",
    "m"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Locate control\n",
    "\n",
    "Adds a control button that when clicked, the user device geolocation is displayed.\n",
    "\n",
    "To work properly in production, the connection needs to be encrypted, otherwise browser will not\n",
    "allow users to share their location."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgCiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgTF9OT19UT1VDSCA9IGZhbHNlOwogICAgICAgICAgICBMX0RJU0FCTEVfM0QgPSBmYWxzZTsKICAgICAgICA8L3NjcmlwdD4KICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjEyLjQubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2Nzcy9ib290c3RyYXAubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9mb250LWF3ZXNvbWUvNC42LjMvY3NzL2ZvbnQtYXdlc29tZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC4yL2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9weXRob24tdmlzdWFsaXphdGlvbi9mb2xpdW0vbWFzdGVyL2ZvbGl1bS90ZW1wbGF0ZXMvbGVhZmxldC5hd2Vzb21lLnJvdGF0ZS5jc3MiLz4KICAgIDxzdHlsZT5odG1sLCBib2R5IHt3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7bWFyZ2luOiAwO3BhZGRpbmc6IDA7fTwvc3R5bGU+CiAgICA8c3R5bGU+I21hcCB7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7cmlnaHQ6MDtsZWZ0OjA7fTwvc3R5bGU+CiAgICAKICAgICAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwKICAgICAgICAgICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgICAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAgICAgI21hcF9jZGE4NGUxODU4MDc0Y2IwOTdhNjk0ZDIyZTBjYjFiNiB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgbGVmdDogMC4wJTsKICAgICAgICAgICAgICAgICAgICB0b3A6IDAuMCU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIDwvc3R5bGU+CiAgICAgICAgCiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2xlYWZsZXQtbG9jYXRlY29udHJvbC8wLjY2LjIvTC5Db250cm9sLkxvY2F0ZS5taW4uY3NzIi8+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvbGVhZmxldC1sb2NhdGVjb250cm9sLzAuNjYuMi9MLkNvbnRyb2wuTG9jYXRlLm1pbi5qcyI+PC9zY3JpcHQ+CjwvaGVhZD4KPGJvZHk+ICAgIAogICAgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvbGl1bS1tYXAiIGlkPSJtYXBfY2RhODRlMTg1ODA3NGNiMDk3YTY5NGQyMmUwY2IxYjYiID48L2Rpdj4KICAgICAgICAKPC9ib2R5Pgo8c2NyaXB0PiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFwX2NkYTg0ZTE4NTgwNzRjYjA5N2E2OTRkMjJlMGNiMWI2ID0gTC5tYXAoCiAgICAgICAgICAgICAgICAibWFwX2NkYTg0ZTE4NTgwNzRjYjA5N2E2OTRkMjJlMGNiMWI2IiwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjZW50ZXI6IFs0MS45NywgMi44MV0sCiAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NywKICAgICAgICAgICAgICAgICAgICB6b29tOiAxMCwKICAgICAgICAgICAgICAgICAgICB6b29tQ29udHJvbDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBwcmVmZXJDYW52YXM6IGZhbHNlLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwoKICAgICAgICAgICAgCgogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyX2Y2MDEwN2I1ZTRmYTQxY2Q4MGFjZGI3MWQzYWIyNGZjID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAiaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmciLAogICAgICAgICAgICAgICAgeyJhdHRyaWJ1dGlvbiI6ICJEYXRhIGJ5IFx1MDAyNmNvcHk7IFx1MDAzY2EgaHJlZj1cImh0dHA6Ly9vcGVuc3RyZWV0bWFwLm9yZ1wiXHUwMDNlT3BlblN0cmVldE1hcFx1MDAzYy9hXHUwMDNlLCB1bmRlciBcdTAwM2NhIGhyZWY9XCJodHRwOi8vd3d3Lm9wZW5zdHJlZXRtYXAub3JnL2NvcHlyaWdodFwiXHUwMDNlT0RiTFx1MDAzYy9hXHUwMDNlLiIsICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwgIm1heE5hdGl2ZVpvb20iOiAxOCwgIm1heFpvb20iOiAxOCwgIm1pblpvb20iOiAwLCAibm9XcmFwIjogZmFsc2UsICJvcGFjaXR5IjogMSwgInN1YmRvbWFpbnMiOiAiYWJjIiwgInRtcyI6IGZhbHNlfQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZGE4NGUxODU4MDc0Y2IwOTdhNjk0ZDIyZTBjYjFiNik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGxvY2F0ZV9jb250cm9sXzZiZTA2OTI5YjI4YjQyZDM5ZDEzOGRlNTExMmU0ZDgyID0gTC5jb250cm9sLmxvY2F0ZSgKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2NkYTg0ZTE4NTgwNzRjYjA5N2E2OTRkMjJlMGNiMWI2KTsKICAgICAgICAKPC9zY3JpcHQ+\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
      ],
      "text/plain": [
       "<folium.folium.Map at 0x7f819c3bdb38>"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m = folium.Map([41.97,2.81])\n",
    "\n",
    "plugins.LocateControl().add_to(m)\n",
    "\n",
    "# If used with Draw plugin, LocateControl needs to be added before it.\n",
    "# Draw().add_to(m)\n",
    "\n",
    "m"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
